簡體   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