这是我的问题:我有一个字符串。然后我想用相应的大写字母替换小写字母,并且还想知道它必须为字符串做的替换次数。
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]
我也试图使用字符串的替换功能,但是也没有用。
答案 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