我想在字符串中查找并替换大写字符(如_upperchar
)。
例如:输入:HeLLo Capital Letters
输出:_He_L_Lo _Capital _Letters
我试过了:
print "saran"
value = "HeLLo Capital Letters"
for word in value:
print word
if word.isupper():
char = "_"
value = value.replace(word,char + word)
print value
我得到的输出是,
_He___L___Lo _Capital ___Letters
有人请帮我减少额外的下划线。
答案 0 :(得分:3)
查看re.sub
>>> import re
>>> re.sub(r'([A-Z])', r'_\1', value)
'_He_L_Lo _Capital _Letters'
您的示例中的问题不是您在迭代时修改字符串。 Python将在for循环的开头创建iter(value)
,并且在此之后更改为value
,因为字符串是不可变的,所以不会影响循环。问题是value.replace
将替换字符串中的所有匹配项,并且例如有3个大写Ls,每个L将获得3个下划线(value.replace('L', '_L')
发生3次)。
答案 1 :(得分:2)
只需使用str.join
,如果ch / letter为大写,则在ch之前添加_
,否则只保留字母/ ch:
s= "HeLLo Capital Letters"
print("".join(["_" + ch if ch.isupper() else ch for ch in s]))
_He_L_Lo _Capital _Letters
你遇到问题是因为你每次都在整个字符串上调用replace,所以重复的L's最终得到三个_
。
如果您在循环开始时添加print value,word
,您将看到会发生什么:
HeLLo Capital Letters H
_HeLLo Capital Letters e
_HeLLo Capital Letters L
_He_LLo Capital Letters L # second L
_He__LLo Capital Letters o # after replacing twice we now have double _
........................
针对正则表达式的一些时间显示列表comp是最佳方法:
In [13]: s = s * 50
In [14]: timeit "".join(["_" + ch if ch.isupper() else ch for ch in s])
10000 loops, best of 3: 98.9 µs per loop
In [15]: timeit r.sub( r'_\1', s)
1000 loops, best of 3: 296 µs per loop
答案 2 :(得分:1)
仔细查看代码执行过程中发生的情况。我已经添加了一些" print"显示正在发生的事情的陈述:
L
您遇到多个L
个字符,并为每个字符执行替换_L
→L
,因此您获得:
_L
→__L
→___L
→L
→...
此处的其他解决方案将替换(_L
→{{1}})应用于字符级别,而不是整个字符串;这就是为什么他们的工作,而你的工作没有。
答案 3 :(得分:1)
你的代码片段中的问题是,当你第一次将H改为_H时,下次迭代时,它再次考虑H,因为它现在处于第二位!因此,不要替换,只需创建一个新的字符串。
value = "HeLLo Capital Letters"
new_value = ""
for word in value:
#print(word)
if word.isupper():
char = "_"
new_value += char + word
else:
new_value += word
print(new_value)
如果遇到大写字符,则执行第一个条件,否则只附加小写字符
答案 4 :(得分:-1)
print "saran"
value = "HeLLo Capital Letters"
print ''.join(['_'+ x if x.isupper() else x for x in value])
答案 5 :(得分:-1)
value = "HELLO Capital Letters"
for word in value:
str = ""
if word.isupper():
val = word
output=word.replace(val, "_"+word)
str = str + output
print str