查找并替换大写字符

时间:2015-07-20 10:49:29

标签: python string

我想在字符串中查找并替换大写字符(如_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

有人请帮我减少额外的下划线。

6 个答案:

答案 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个字符,并为每个字符执行替换_LL,因此您获得:

_L__L___LL→...

此处的其他解决方案将替换(_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