我知道还有其他一些问题可以解决使用re.sub替换部分匹配字符串的问题,但答案主要围绕回顾捕获组。我的情况有点不同:
我在应用程序的另一部分中生成'(?:i|æ|ʏ|ɞ).(?:i|æ|ʏ|ɞ)'
和^.
等正则表达式。如果我有字符串'abcd'
和('b', 'c')
对,我想替换正则表达式匹配的b
所有实例(.
)。
例如,如果我有规则'(?:x|y|z).(?:h|i|j)'
,并且所需的更改为a
到b
,则应发生以下情况:
xah -> xbh
yai -> ybi
zaz -> zaz (no change)
我已尝试使用re.sub
,将.
替换为搜索字符串中的目标,替换为替换字符串中的替换,但这会替换目标字符串中的整个匹配,实际上我只想改变一小部分。我在使用匹配组并在替换中回顾它们时遇到的问题是,我不知道会有多少,或者他们将会有什么样的订单 - 甚至可能没有 - 所以我&# 39;我试图找到一个灵活的解决方案。
非常感谢任何帮助!这很难解释,所以如果需要进一步澄清,请问:)。
答案 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