python中类ACD | BCD正则表达式的替换

python中类ACD | BCD正则表达式的替换,python,regex,Python,Regex,A、 B、C和D表示正则表达式的不同部分 我想要达到的效果是: 输入字符串是ACD或BCD。用E代替C后,输出应为AED或BED 我使用的正则表达式: r=(A)C(D)|(B)C(D) 然而,当我进行替换时,问题出现了。 如果使用r.sub(r'\1s0\2',inputstring)则当输入为BCD时,将出现不匹配的组错误。如果使用r.sub(r'\3s0\4',inputstring)则当输入为ACD时,将出现不匹配的组错误 那么如何编辑正则表达式以避免这种情况呢?您可以使用替换函数而不

A、 B、C和D表示正则表达式的不同部分

我想要达到的效果是: 输入字符串是ACD或BCD。用E代替C后,输出应为AED或BED

我使用的正则表达式:

r=(A)C(D)|(B)C(D)
然而,当我进行替换时,问题出现了。 如果使用
r.sub(r'\1s0\2',inputstring)
则当输入为BCD时,将出现不匹配的组错误。如果使用
r.sub(r'\3s0\4',inputstring)
则当输入为ACD时,将出现不匹配的组错误


那么如何编辑正则表达式以避免这种情况呢?

您可以使用替换函数而不是字符串。函数的返回值用作替换字符串

import re

def repl(m):
    # m: the matched object.
    if m.group(1) is not None:
        prefix, suffix = m.group(1), m.group(2)
    else:
        prefix, suffix = m.group(3), m.group(4)
    return '{}E{}'.format(prefix, suffix)

re.sub('(A)C(D)|(B)C(D)', repl, 'ACD') # AED
re.sub('(A)C(D)|(B)C(D)', repl, 'BCD') # BED
或者,如果您使用Python内置的
re
module,您可以执行以下操作:

>>> import regex # NOTE: not `re`, but `regex`
>>>
>>> regex.sub('(A)C(D)|(B)C(D)', r'\1\3E\2\4', 'ACD')
'AED'
>>> regex.sub('(A)C(D)|(B)C(D)', r'\1\3E\2\4', 'BCD')
'BED'
使用
(A | B)C(D)
代替
(A)C(D)|(B)C(D)


(A | B)C(D)
替换为
\1E\2
?谢谢。我知道我可以通过控制流量来完成。我想知道我是否可以纯粹用正则表达式来解决它。@user2923419,如果正则表达式的前导部分是固定长度的,您可以使用正向环视断言:
re.sub(“(?@user2923419,我添加了一个替代解决方案(使用第三方模块
regex
)。请查看。
import re
r = re.compile(r'(A|B)C(D)')
r.sub(r'\1E\2', 'ACD')    # 'AED'
r.sub(r'\1E\2', 'BCD')    # 'BED'