繁体   English   中英

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

[英]Python regex - matching character sequences using prior matched characters

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

我从与所有这些示例匹配的以下Python正则表达式开始:

(.)(.)\2\1

为了排除第二组(“ zzzz”,“ vvvv”),我尝试了以下修改:

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

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

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

根据Python 2.7.12文档:

\\数

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

(我强调了)。

我发现这句话模棱两可,或者至少不清楚,因为它向我暗示了数字转义应该解析为集合中单个排除的字符,但这似乎没有发生。

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

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

这似乎与“ zzzz”或“ zxxz”不匹配。

您想对第二个捕获组中的\\1做一个否定的超前断言(?!...) ,那么它将起作用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM