使用正则表达式用一个小写字母替换python中的大写字母重复字母
我试图用小写字母的单个实例替换字符串中重复两次的大写字母的任何实例。我使用下面的正则表达式,它能够匹配重复的大写字母,但我不确定如何使小写字母被替换。使用正则表达式用一个小写字母替换python中的大写字母重复字母
import re
s = 'start TT end'
re.sub(r'([A-Z]){2}', r"\1", s)
>>> 'start T end'
如何制作“\ 1”小写?我不应该使用正则表达式来做到这一点吗?
Pass a function作为repl
的说法。该MatchObject
传递给这个函数和.group(1)
给人的第一括号内的亚组:
import re
s = 'start TT end'
callback = lambda pat: pat.group(1).lower()
re.sub(r'([A-Z]){2}', callback, s)
编辑
是的,你应该为了例如使用([A-Z])\1
而不是([A-Z]){2}
到不比赛。 (请参见@ bobince的answer。)
import re
s = 'start TT end'
re.sub(r'([A-Z])\1', lambda pat: pat.group(1).lower(), s) # Inline
给出:
'start t end'
您不能在替换字符串中更改大小写。你会需要更换功能:
>>> def replacement(match):
... return match.group(1).lower()
...
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
'start t end'
标识更换可以是一个字符串(如你有在这里)或函数“REPL”参数。这将做你希望的东西:
import re
def toLowercase(matchobj):
return matchobj.group(1).lower()
s = 'start TT end'
re.sub(r'([A-Z]){2}', toLowercase, s)
>>> 'start t end'
试试这个:
def tol(m):
return m.group(0)[0].lower()
s = 'start TTT AAA end'
re.sub(r'([A-Z]){2,}', tol, s)
注意,这并不能取代烧毛上字母。如果你想这样做,请使用r'([A-Z]){1,}'
。
OP说:*重复自己两次* – SilentGhost 2010-11-10 14:35:20
@SilentGhost。我的错。如果单个上面的字符不应该被触摸,那么应该如Ignacio所建议的那样。 – khachik 2010-11-10 14:40:13
如果你看起来和bobince's和jens的答案,你会看到更短的方式来做到这一点。 – SilentGhost 2010-11-10 14:44:26
警告!这篇文章没有要求。继续自己的责任!
我不知道如何可能是角落案件,但这是普通的Python如何做我的天真编码。
import string
s = 'start TT end AAA BBBBBBB'
for c in string.uppercase:
s = s.replace(c+c,c.lower())
print s
""" Output:
start t end aA bbbB
"""
不知道如何使它小写,但你应该使用''([AZ]){2,}''而不是''([AZ]){2}''替换任何实例。 – khachik 2010-11-10 14:25:26
你的正则表达式也匹配两个不同的上限。 – 2010-11-10 14:26:21