我正在尝试替换大写字母的任何实例,这些大写字母在字符串中重复两次,并且在小写字母中包含该字母的单个实例。我使用以下正则表达式,它能够匹配重复的大写字母,但我不确定如何使被替换的字母小写。
import re
s = 'start TT end'
re.sub(r'([A-Z]){2}', r"\1", s)
>>> 'start T end'
如何制作“\ 1”小写字母?我不应该使用正则表达式来执行此操作吗?
答案 0 :(得分:42)
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}
,以便不匹配,例如AZ
。 (参见@ 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'
答案 1 :(得分:6)
您无法更改替换字符串中的大小写。您需要更换功能:
>>> def replacement(match):
... return match.group(1).lower()
...
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
'start t end'
答案 2 :(得分:1)
你可以用正则表达式来做,只需传递一个像the docs这样的替换函数。问题在于你的模式。
实际上,您的模式匹配任何两个大写字母的运行。我会将实际模式留给您,但它以AA|BB|CC|
开头。
答案 3 :(得分:1)
def replace(s):
return " ".join(re.findall(r"[A-Z]){2}", s)).lower()
我想这就是您想要的。
答案 4 :(得分:0)
标识替换的'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'
答案 5 :(得分:0)
试试这个:
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,}'
。
答案 6 :(得分:0)
警告!这篇文章没有按要求提供。继续自己负责!
我不知道角落情况有多可能,但这是普通的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
"""