Python正则表达式 - 使用先前匹配的字符匹配字符序列

时间:2016-12-09 04:14:39

标签: python regex string

我希望匹配" zxxz"等字符串。和" vbbv"其中一个字符后跟一对与第一个字符不匹配的相同字符,然后是第一个字符。因此我希望匹配" zzzz"等字符串。和" vvvv"。

我开始使用以下Python正则表达式,它们匹配所有这些示例:

(.)(.)\2\1

为了排除第二组(" zzzz"," vvvv"),我尝试了这个修改:

(.)([^\1])\2\1

我的理由是第二组可以包含任何单个字符,只要它与第一组中匹配的字符不同。

不幸的是,这似乎不起作用,因为它仍然匹配" zzzz"和" vvvv"。

根据Python 2.7.12文档:

  

\数目

     

匹配相同编号的组的内容。组从1开始编号。例如,(。+)\ 1匹配''或者' 55 55'但不是' 55' (注意组后面的空格)。此特殊序列只能用于匹配前99个组中的一个。如果数字的第一个数字是0,或者数字是3个八进制数字长,则不会将其解释为组匹配,而是解释为具有八进制数值的字符。 在' ['和']'对于字符类,所有数字转义都被视为字符。

(我的重点补充)。

我发现这句话含糊不清,或者至少不清楚,因为它告诉我数字转义应该作为集合中的单个排除字符解析,但这似乎不会发生。

此外,以下正则表达式似乎无法正常工作:

(.)[^\1][^\1][\1]

这似乎不匹配" zzzz"或" zxxz"。

1 个答案:

答案 0 :(得分:2)

您希望在第二个捕获组中的\1上执行negative lookahead assertion (?!...),然后它会起作用:

r'(.)((?!\1).)\2\1'

测试您的示例:

>>> import re
>>> re.match(r'(.)((?!\1).)\2\1', 'zxxz')
<_sre.SRE_Match object at 0x109b661c8>
>>> re.match(r'(.)((?!\1).)\2\1', 'vbbv')
<_sre.SRE_Match object at 0x109b663e8>
>>> re.match(r'(.)((?!\1).)\2\1', 'zzzz') is None
True
>>> re.match(r'(.)((?!\1).)\2\1', 'vvvv') is None
True