通常我们会编写以下内容来替换一个匹配项:
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.
我想要的是,可能使用反向引用替换每个具有特定文本的组。即我想用"取代第一组(是)和#34;第二组(生命)与蝴蝶"。
也许是这样的。但以下不是工作代码。
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中的一个语句中替换多个组?
答案 0 :(得分:3)
您可以使用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.'
答案 1 :(得分: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.
答案 2 :(得分: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)
使用这种方法,您不必担心基于交替创建过大的正则表达式模式。您可以根据要求调整模式以包括单词边界,或仅匹配字母(例如[\W\d_]+
)等。重点是模式应该匹配字典中键的所有搜索项。
if m.group() in dt else m.group()
部分正在检查找到的匹配是否作为字典中的键存在,如果不存在,则返回匹配。否则,返回字典中的值。
答案 3 :(得分: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.'