Python正则表达式在交换组后面

时间:2019-03-31 15:04:49

标签: python regex lookbehind

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

我可以轻松地用两个词代替

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

但是我只想在苹果前面有30个词时交换这两个词。

如何执行此操作?

我尝试过后面的方法:
re.sub('(?<=\d\d) apples', r'\2 \1', 'Look 30 apples.')

但是它不会占用\ 1和\ 2组。

1 个答案:

答案 0 :(得分:2)

使用(?<=\d\d) apples模式时,匹配从2位数字后立即开始,并且以空格加apples开头。如果您尝试交换两个值,则都需要消费,并且如您所见,后面的外观不会消耗文本。

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

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

请参见regex demoRegulex graph

enter image description here

详细信息

  • (\d+)-捕获组1(替换模式为\1):一位或多位数字
  • (\s+)-捕获组2(替换模式为\2):一个或多个空格
  • (apples)-捕获组3(替换模式为\3):apples

Python demo

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