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
.
import re
result = re.sub(r"(\d+)(\s+)(apples)", r"", "Look 30 apples.")
print(result)
我在练习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
.
import re
result = re.sub(r"(\d+)(\s+)(apples)", r"", "Look 30 apples.")
print(result)