2010-11-10 120 views
24

我試圖用小寫字母的單個實例替換字符串中重複兩次的大寫字母的任何實例。我使用下面的正則表達式,它能夠匹配重複的大寫字母,但我不確定如何使小寫字母被替換。使用正則表達式用一個小寫字母替換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

回答

39

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

1

您可以用正則表達式做,只是通過一個函數作爲替代像the docs說。問題在於你的模式。

就這樣,您的模式匹配任意兩個大寫字母。我會將實際模式留給您,但它始於AA|BB|CC|

6

您不能在替換字符串中更改大小寫。你會需要更換功能:

>>> def replacement(match): 
...  return match.group(1).lower() 
... 
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end') 
'start t end' 
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' 
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,}'

+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

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 
""" 
相關問題