【问题标题】:Replacing only the captured group using re.sub and multiple replacements使用 re.sub 和多个替换仅替换捕获的组
【发布时间】:2017-08-14 20:53:12
【问题描述】:

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

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 输入一个列表,该列表将遍历每个匹配项的列表并生成 sub 因此。换句话说, 我希望列表['Swimming, Eating, Jogging'] 的每个项目与 匹配,(如方法 zip)并进行替换。

所以输出应该是这样的(即使是单个总输出也可以:

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

【问题讨论】:

  • 您为什么要单独捕获事物而不是 r'(I love )\w+\.' 以及什么对您的用例不起作用?第二个你就不能按期分开吗?

标签: python regex


【解决方案1】:

您可以使用基于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

【讨论】:

  • 哇,这么简洁。我要去玩弄代码,看看有什么问题。
  • 谢谢。似乎周转不适用于可变宽度大小,对吧?含义——我不能在我想使用周转的组内使用量词。有解决办法吗?
  • 向前看在可变宽度下工作正常,但向后看却不行。
猜你喜欢
  • 2015-02-22
  • 2019-12-14
  • 2013-02-03
  • 2015-01-17
  • 2015-02-09
  • 2011-04-26
  • 2017-06-25
  • 2020-06-26
相关资源
最近更新 更多