使用正则表达式用一个小写字母替换python中的大写字母重复字母

问题描述:

我试图用小写字母的单个实例替换字符串中重复两次的大写字母的任何实例。我使用下面的正则表达式,它能够匹配重复的大写字母,但我不确定如何使小写字母被替换。使用正则表达式用一个小写字母替换python中的大写字母重复字母

import re 
s = 'start TT end' 
re.sub(r'([A-Z]){2}', r"\1", s) 
>>> 'start T end' 

如何制作“\ 1”小写?我不应该使用正则表达式来做到这一点吗?

+0

不知道如何使它小写,但你应该使用''([AZ]){2,}''而不是''([AZ]){2}''替换任何实例。 – khachik 2010-11-10 14:25:26

+0

你的正则表达式也匹配两个不同的上限。 – 2010-11-10 14:26:21

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' 
+0

谢谢,我感谢你的帮助。 – ajt 2010-11-10 17:53:43

+0

@ajt不客气。 – jensgram 2010-11-11 09:07:44

您可以用正则表达式做,只是通过一个函数作为替代像the docs说。问题在于你的模式。

就这样,您的模式匹配任意两个大写字母。我会将实际模式留给您,但它始于AA|BB|CC|

您不能在替换字符串中更改大小写。你会需要更换功能:

>>> 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,}'

+0

OP说:*重复自己两次* – SilentGhost 2010-11-10 14:35:20

+0

@SilentGhost。我的错。如果单个上面的字符不应该被触摸,那么应该如Ignacio所建议的那样。 – khachik 2010-11-10 14:40:13

+0

如果你看起来和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 
"""