使用re.sub和多个替换仅替换捕获的组

时间:2017-08-14 20:53:12

标签: python regex

以下是我创建的一个简单示例。

string = 'I love sleeping. I love singing. I love dancing.'
pattern =re.compile(r'I love (\w+)\.')

我想用re.sub。替换(\ w +)部分 这个问题分为两部分:

我想替换(\ w +),而不必求助于群组 捕获文本的其余部分。

所以我不想做类似的事情:

pattern =re.compile(r'(I) (love) (\w+)\.')
re.sub(pattern, r'/1 /2 swimming', string)

因为在处理大量文本时这可能是不可靠的 可选组。

第二部分:

因为我将有三个匹配,是否可以输入一个带有re.sub的列表,该列表将遍历每个匹配的列表并生成子 因此。换句话说, 我希望列表['Swimming, Eating, Jogging']中的每个项目都能与之同步 匹配,(比如方法zip)并进行替换。

所以输出应该是这样的(甚至单个总输出也没关系:

'I love Swimming'
'I love Eating'
'I love Jogging'

1 个答案:

答案 0 :(得分:4)

您可以使用基于lookbehind和lookahead的正则表达式,然后使用lambda函数来迭代替换单词:

>>> words = ['Swimming', 'Eating', 'Jogging']
>>> pattern = re.compile(r'(?<=I love )\w+(?=\.)')
>>> print pattern.sub(lambda m: words.pop(0), string)
'I love Swimming. I love Eating. I love Jogging.'

Code Demo