我正在尝试按顺序替换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'
答案 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
,其中替换“字符串”实际上可以是回调函数。每次匹配都会调用一次该函数,因此您可以附加所需的文本。