如何用大写字母替换字符串中的小写字母,也找不到替换

时间:2016-03-28 12:41:35

标签: python regex string

这是我的问题:我有一个字符串。然后我想用相应的大写字母替换小写字母,并且还想知道它必须为字符串做的替换次数。

S = "ABCdefGHijKLmNop"

Output string = "ABCDEFGHIJKLMNOP"

和替换次数(本例中为6次)

然后我尝试了re.sub:

New = re.sub("[a-z]","[A-Z]",S)

但输出如下:

ABC[A-Z][A-Z][A-Z]GH[A-Z][A-Z]KL[A-Z]N[A-Z][A-Z]

我也试图使用字符串的替换功能,但是也没有用。

3 个答案:

答案 0 :(得分:6)

您可以使用.upper()以大写字母的形式返回字符串的副本,并使用islower()返回sum()以获取替换次数。

>>> S = "ABCdefGHijKLmNop"
>>> S.upper()
'ABCDEFGHIJKLMNOP'
>>> sum(1 for i in S if i.islower())
8

另一种方法是使用生成器函数和鲜为人知的itertools.count类。

>>> from itertools import count
>>> it = count(0)
>>> def substitute(string):
...     for char in string:
...         if char.islower():
...             next(it)
...             yield char.upper()
...         else:
...             yield char
... 
>>> ''.join(substitute(S))
'ABCDEFGHIJKLMNOP'
>>> it
count(8)

表现什么?

%%timeit 
capitalize(S)
100000 loops, best of 3: 6.74 µs per loop
%%timeit
S.upper()
sum(1 for i in S if i.islower())
100000 loops, best of 3: 3.12 µs per loop
%%timeit
''.join(substitute(S))
it
100000 loops, best of 3: 6.9 µs per loop

答案 1 :(得分:0)

如果您想要替换次数以及替换次数,您需要定义自己的函数:

def capitalize(string):
    substitutions = 0
    newstring = ""
    for char in string:
        newstring += char.upper()
        if char.islower():
            substitutions += 1
    return newstring, substitutions

使用:

>>> string = "ABCdefGHijKLmNop"
>>> newstring, substitutions = capitalize(string)
>>> newstring
'ABCDEFGHIJKLMNOP'
>>> substitutions
8

答案 2 :(得分:0)

如果你真的想使用正则表达式,我认为最简单的方法是使用lambda:

import string
S="ABCdefGHijKLmNop"
len(filter(lambda x: x in string.lowercase, S))
callback = lambda pat: pat.group(1).upper()
new = re.sub(r'([a-z])', callback, S)

>>> 8
>>> print new
ABCDEFGHIJKLMNOP