如何在Python中转换以下字符串?

4

输入: 用户ID/联系号码

输出:user-id/contact-number

我尝试了以下代码:

s ="UserID/ContactNumber"

list = [x for x in s]

for char in list:

     if char != list[0] and char.isupper():
            list[list.index(char)] = '-' + char

 fin_list=''.join((list))
 print(fin_list.lower())

但我得到的输出是:
  user-i-d/-contact-number

2
在迭代列表时修改它通常是一个不好的主意。 - FamousJameous
1
你需要特别处理连续的大写字符。另外请注意,list(s)会给你一个字符列表,而list是你自己变量的不好的名称。 - jonrsharpe
2
只有当你改变它的长度时才需要这样做。 - jonrsharpe
即使你只是在更改列表,它也会影响开发人员的推理能力。在代码审查中,我建议将list_in和list_out作为单独的列表,仅仅出于开发人员的推理考虑。 - Warren P
3个回答

7
您可以使用正向回顾断言的正则表达式来实现此目的:
>>> import re
>>> s  ="UserID/ContactNumber"
>>> re.sub('(?<=[a-z])([A-Z])', r'-\1', s).lower()
'user-id/contact-number'

2
像这样的东西怎么样:
s ="UserID/ContactNumber"
so = ''
for counter, char in enumerate(s):
    if counter == 0:
        so = char
    elif char.isupper() and not (s[counter - 1].isupper() or s[counter - 1] == "/"):
        so += '-' + char
    else:
        so += char
print(so.lower())

你的代码片段我做了哪些修改?

  • 你检查了第一个字符是否为大写字母。
  • 我增加了对前一个字符的检查,以避免在前一个字符为大写字母(如 ID 中的 D)或在前一个字符为\(如 Contact 中的 C)时进行检查。

  • 你在迭代列表 list 的元素时修改了它,这是很危险的。

  • 相反,我创建了一个输出字符串来存储新值。

不要提供新的解决方案,而是告诉他/她的逻辑有什么问题? - helloV
@helloV,你说得完全正确,我已经编辑了我的答案,解释了我从他/她的代码中所做的更改。 - Xavier C.

-1

我做了类似这样的事情

s ="UserID/ContactNumber"

new = []
words = s.split("/")

for word in words:
    new_word = ""
    prev = None
    for i in range(0, len(word)):
        if prev is not None and word[i].isupper() and word[i-1].islower():
            new_word = new_word  + "-" + word[i]
            prev = word[i]
            continue
        new_word = new_word  + word[i]
        prev = word[i]
    new.append(new_word.lower())

print "/".join(new)

用户ID/联系电话

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接