Python re.sub:替换包含任意数量捕获组的匹配字符串的一部分

时间:2016-11-01 05:56:04

标签: python regex

我知道还有其他一些问题可以解决使用re.sub替换部分匹配字符串的问题,但答案主要围绕回顾捕获组。我的情况有点不同:

我在应用程序的另一部分中生成'(?:i|æ|ʏ|ɞ).(?:i|æ|ʏ|ɞ)'^.等正则表达式。如果我有字符串'abcd'('b', 'c')对,我想替换正则表达式匹配的b所有实例(.)。

例如,如果我有规则'(?:x|y|z).(?:h|i|j)',并且所需的更改为ab,则应发生以下情况:

xah -> xbh
yai -> ybi
zaz -> zaz (no change)

我已尝试使用re.sub,将.替换为搜索字符串中的目标,替换为替换字符串中的替换,但这会替换目标字符串中的整个匹配,实际上我只想改变一小部分。我在使用匹配组并在替换中回顾它们时遇到的问题是,我不知道会有多少,或者他们将会有什么样的订单 - 甚至可能没有 - 所以我&# 39;我试图找到一个灵活的解决方案。

非常感谢任何帮助!这很难解释,所以如果需要进一步澄清,请问:)。

1 个答案:

答案 0 :(得分:2)

您可以使用“lookahead”和“lookbehind”断言,如下所示:

import re

tests = (
    ('xah', 'xbh'),
    ('yai', 'ybi'),
    ('zaz', 'zaz'),
)

for test_in, test_out in tests:
    out = re.sub('(?<=x|y|z)a(?=h|i|j)', 'b', test_in)
    assert test_out == out