我正在尝试在具有两组可选字符的模式上使用python正则表达式,这些字符可能存在也可能不存在。以下是我想要完成的事情。
h becomes a when h is preceded by o but can also be preceded by a colon (:)
following the o and then maybe followed by f,y,r (f|y|r)
因此,此规则将适用于以下模式。
o:fh -> o:fa
ofh -> ofa
o:h -> o:a
oh -> oa
以下是我正在尝试的内容。
re.sub(ur"o[(:|)][(f|y|r)]h", "o\1\2a", word);
我真的很难对分组以及可能存在或不存在的两组可选字符:
和(f|y|r)
感到困惑。任何帮助是极大的赞赏。谢谢!
答案 0 :(得分:2)
使用?
跟随正则表达式元素是可选的,而不是将它们括在括号中。编写表达式的正确方法( 正确方法)是:
re.sub(ur"o(:?[fyr]?)h", ur"o\1a", word)
请注意,替换字符串必须是原始的(r" "
),以便\1
不会被解释为字符0x01。
答案 1 :(得分:1)
您的语法不正确,您试图在capturing groups内使用character classes。在最简单的形式中,它列出了可以在方括号内匹配的字符(匹配列表中的任何字符)
您可以使用?
>>> re.sub(ur'(o:?[yrf]?)h', ur'\1a', word)
说明:
( # group and capture to \1:
o # 'o'
:? # ':' (optional)
[yrf]? # any character of: 'y', 'r', 'f' (optional)
) # end of \1
h # 'h'
您可以使用支持可变长度lookbehind的regex模块。
>>> import regex
>>> regex.sub(r'(?<=o:?[yrf]?)h', 'a', word)