gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:29:48 24 4
gpt4 key购买 nike

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

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

(.)(.)\2\1

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

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

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

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

根据 Python 2.7.12 文档:

\number

Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, (.+) \1 matches 'the the' or '55 55', but not 'thethe' (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of number is 0, or number is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value number. Inside the '[' and ']' of a character class, all numeric escapes are treated as characters.

(我添加了强调)。

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

此外,以下正则表达式似乎也没有像我预期的那样工作:

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

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

最佳答案

你想做 negative lookahead assertion (?!...)在第二个捕获组中的 \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

关于Python 正则表达式 - 使用先前匹配的字符来匹配字符序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41052994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com