我正在练习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组。
答案 0 :(得分:2)
使用(?<=\d\d) apples
模式时,匹配从2位数字后立即开始,并且以空格加apples
开头。如果您尝试交换两个值,则都需要消费,并且如您所见,后面的外观不会消耗文本。
因此,您需要在模式中的此处使用捕获组并替换为相应的反向引用:
result = re.sub(r"(\d+)(\s+)(apples)", r"\3\2\1", 'Look 30 apples.')
请参见regex demo。 Regulex graph:
详细信息
(\d+)
-捕获组1(替换模式为\1
):一位或多位数字(\s+)
-捕获组2(替换模式为\2
):一个或多个空格(apples)
-捕获组3(替换模式为\3
):apples
。import re
result = re.sub(r"(\d+)(\s+)(apples)", r"\3\2\1", "Look 30 apples.")
print(result)