分别替换多次出现的相同字符串
问题描述:
我试图按顺序对re.findall的结果进行替换。但是,在该示例中,出现了多个相同的字符串。例如:分别替换多次出现的相同字符串
text = "SOME TEXT, monday-friday, MORE TEXT, thursday, MORE TEXT, monday-friday'
regex = re.compile(REGEX,re.I)
possiblereplacements = regex.findall(text)
的结果是:
'monday-friday','thursday','monday-friday'
我然后需要为每个元素的置换列表中的单独。例如:
for item in possiblereplacements:
text = re.sub(item,item+' 11:00-17:00',text)
但是这个替换所有实例所以最后你风与:
text = "SOME TEXT, monday-friday 11:00-17:00 11:00-17:00, MORE TEXT, thursday 11:00-17:00, MORE TEXT, monday-friday 11:00-17:00 11:00-17:00'
如何调整这让我期望的结果是:
text = "SOME TEXT, monday-friday 11:00-17:00, MORE TEXT, thursday 11:00-17:00, MORE TEXT, monday-friday 11:00-17:00'
答
相反re.findall
,使用re.finditer
。而不是像现在这样的简单的字符串列表,它会为您提供一系列包含每个匹配的开始索引的MatchObject
。然后你就知道在哪里执行替换。
一个更好的方法是使用re.sub
,其中替换字符串实际上可以是回调函数。该函数将为每个匹配调用一次,因此您可以追加所需的文本。
答
单个更换有什么问题?这里不需要使用re.findall
函数。只需将您的正则表达式放入捕获组中,并将所有匹配的字符替换为组索引1中的字符以及要连接的字符串。
re.sub(r'(regex)', r'\1 11:00-17:00', text)
例子:
>>> text = "SOME TEXT, monday-friday, MORE TEXT, thursday, MORE TEXT, monday-friday"
>>> re.sub(r'(?i)([^,]*day[^,]*)', r'\1 11:00-17:00', text)
'SOME TEXT, monday-friday 11:00-17:00, MORE TEXT, thursday 11:00-17:00, MORE TEXT, monday-friday 11:00-17:00'
什么是'REGEX'这里 – vks 2014-12-19 06:58:13