Python Regex试图找到具有两组可选字符的模式

时间:2014-08-09 20:33:43

标签: python regex

我正在尝试在具有两组可选字符的模式上使用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)感到困惑。任何帮助是极大的赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

使用?跟随正则表达式元素是可选的,而不是将它们括在括号中。编写表达式的正确方法( 正确方法)是:

re.sub(ur"o(:?[fyr]?)h", ur"o\1a", word)

请注意,替换字符串必须是原始的(r" "),以便\1不会被解释为字符0x01。

答案 1 :(得分:1)

您的语法不正确,您试图在capturing groups内使用character classes。在最简单的形式中,它列出了可以在方括号内匹配的字符(匹配列表中的任何字符

Regular expression visualization

您可以使用?

跟随您想要选择的字符,只使用一个组
>>> 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)