Python 正则表达式回顾交换组

Python regex lookbehind swap groups

我在练习re模块,遇到了一个有趣的问题。

我可以轻松替换两个词:

re.sub("30 apples", r"apples 30", 'Look 30 apples.') # 'Look apples 30.'

但我只想在 30 出现在 apples 之前交换这两个词。

如何做到这一点?

我试过后视方法:
re.sub('(?<=\d\d) apples', r' ', 'Look 30 apples.')

但它不带组 \1 和 \2。

当您使用 (?<=\d\d) apples 模式时,匹配会在 2 位数字之后开始,并且是 space 加 apples。如果您尝试交换这两个值,则需要 consume 两者,如您所见,lookbehind 不会消耗文本。

因此,您需要在模式中使用捕获组并替换为相应的反向引用:

result = re.sub(r"(\d+)(\s+)(apples)", r"", 'Look 30 apples.')

参见 regex demo. Regulex graph:

详情

  • (\d+) - 捕获组 1(替换模式中的</code>):一位或多位数字</li> <li><code>(\s+) - 捕获第 2 组(替换模式中的 </code>):一个或多个 whitespaces</li> <li><code>(apples) - 捕获第 3 组(替换模式中的 </code>):<code>apples.

Python demo:

import re
result = re.sub(r"(\d+)(\s+)(apples)", r"", "Look 30 apples.")
print(result)