Python正则表达式试图找到包含两组可选字符的模式

2024-04-23 18:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在一个模式上使用python regex,该模式有两组可选字符,它们可能存在,也可能不存在。下面是我想要完成的。你知道吗

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),它们可能存在也可能不存在。非常感谢您的帮助。谢谢!你知道吗


Tags: thebyis模式be字符canregex
2条回答

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

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'

您可以使用regex模块,它支持可变长度的lookback。你知道吗

>>> import regex
>>> regex.sub(r'(?<=o:?[yrf]?)h', 'a', word)

Regex元素是可选的,在它们后面加上?,而不是用括号括起来。正确的表达方式是:

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

注意,替换字符串必须是原始的(r" "),这样\1就不会被解释为字符0x01。你知道吗

相关问题 更多 >