2017-07-17 98 views
2

通常我們編寫以下更換一次比賽:如何用Python正則表達式替換多個匹配/組?

namesRegex = re.compile(r'(is)|(life)', re.I) 
replaced = namesRegex.sub(r"butter", "There is no life in the void.") 
print(replaced) 

output: 
There butter no butter in the void. 

我想是更換,可能使用反向引用,每個組有一個特定的文本。也就是說,我想用「蝴蝶」替換第一組(是)和第二組(生命)。

也許這樣的事情。但以下是不工作的代碼。

namesRegex = re.compile(r'(is)|(life)', re.I) 
replaced = namesRegex.sub(r"(are) (butterflies)", r"\1 \2", "There is no life in the void.") 
print(replaced) 

有沒有辦法在python中的一個語句中替換多個組?

回答

2

您可以使用lambda替換,映射您想要關聯的關鍵字:

>>> re.sub(r'(is)|(life)', lambda x: {'is': 'are', 'life': 'butterflies'}[x.group(0)], "There is no life in the void.") 
'There are no butterflies in the void.' 
+0

你的答案幫助我增長了力量和智慧。 –

2

您可以先定義地圖一鍵更換,然後用lambda function in replacement

>>> repl = {'is': 'are', 'life': 'butterflies'} 
>>> print re.sub(r'is|life', lambda m: repl[m.group()], "There is no life in the void.") 
There are no butterflies in the void. 

我也建議你使用單詞邊界周圍的按鍵,以保障您的搜索模式:

>>> print re.sub(r'\b(?:is|life)\b', lambda m: repl[m.group()], "There is no life in the void.") 
There are no butterflies in the void. 
0

如果您只想替換特定字詞,請不要超過str.replace()

s = "There is no life in the void." 
s.replace('is', 'are').replace('life', 'butterflies') # => 'There are no butterflies in the void.' 
2

您可以使用與搜索替換值的字典,並使用一個簡單的\w+正則表達式匹配的話:

import re 
dt = {'is' : 'are', 'life' : 'butterflies'} 
namesRegex = re.compile(r'\w+') 
replaced = namesRegex.sub(lambda m: dt[m.group()] if m.group() in dt else m.group(), "There is no life in the void.") 
print(replaced) 

看到一個Python demo

通過這種方法,你不必擔心基於交替創建太大的正則表達式模式。您可以根據要求調整圖案以包含字邊界,或只匹配字母(例如[\W\d_]+)等。要點是模式應該匹配詞典中所有關鍵詞的搜索詞。

if m.group() in dt else m.group()部分正在檢查找到的匹配是否作爲字典中的鍵存在,如果不匹配,則僅返回匹配。否則,返回字典中的值。