分别替换多次出现的相同String

时间:2014-12-19 06:52:15

标签: python regex

我正在尝试按顺序替换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'        

2 个答案:

答案 0 :(得分:3)

单次更换有什么问题?您无需在此处使用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'

答案 1 :(得分:1)

而不是re.findall,请使用re.finditer。它不是像你现在一样的简单字符串列表,而是给你一个MatchObject的序列,它包含每个匹配的起始索引。然后你就知道确切地在哪里进行替换。

更好的方法是使用re.sub,其中替换“字符串”实际上可以是回调函数。每次匹配都会调用一次该函数,因此您可以附加所需的文本。