[英]Python Regex matching already matched sub-string
我是Python Regex的新手,我無法理解以下內容:
我正在嘗試找到一個由三個大寫字母包圍的小寫字母。
我的第一個問題是,下面的正則表達式僅給出一個匹配項,而不是給出的兩個匹配項['AbAD', 'DaDD']
>>> import re
>>>
>>> # String
... str = 'AbADaDD'
>>>
>>> pat = '[A-Z][a-z][A-Z][A-Z]'
>>> regex = re.compile(pat)
>>>
>>> print regex.findall(str)
['AbAD']
我猜上面是由於這樣的事實,第一個正則表達式中的最后一個D
不再可用於匹配? 有什么辦法可以關閉這種匹配。
第二個問題是以下正則表達式:
>>> import re
>>>
>>> # String
... str = 'AbADaDD'
>>>
>>> pat = '[^A-Z][A-Z][a-z][A-Z][A-Z][^A-Z]'
>>> regex = re.compile(pat)
>>>
>>> print regex.findall(str)
[]
基本上,我想要的是在一個小寫字母周圍不要超過三個大寫字母,因此我在它們周圍放置了一個否定的匹配項。 但是['AbAD']
應該匹配,但是沒有匹配。 有任何想法嗎?
這主要是因為比賽重疊。 只需將正則表達式放入前瞻即可處理這種類型的重疊匹配。
(?=([A-Z][a-z][A-Z][A-Z]))
碼:
>>> s = 'AbADaDD'
>>> re.findall(r'(?=([A-Z][a-z][A-Z][A-Z]))', s)
['AbAD', 'DaDD']
對於第二個,您應該使用否定先行和后置斷言,如下所示,
(?=(?<![A-Z])([A-Z][a-z][A-Z][A-Z])(?![A-Z]))
碼:
>>> re.findall(r'(?=(?<![A-Z])([A-Z][a-z][A-Z][A-Z])(?![A-Z]))', s)
['AbAD']
第二個正則表達式的問題是, [^AZ]
消耗了一個字符( 除了第A
之前的大寫字母之外沒有其他字符 ),但是負向后看(?<![AZ])
也可以這樣做,但是它不會消耗任何字符。 它斷言匹配將以大寫字母開頭,但不能為大寫字母。 這就是為什么您不會獲得任何匹配的原因。
正則表達式的問題在於它在進程進行過程中正在消耗字符串,因此在第二場比賽中一無所獲。請提前使用以確保它不會耗盡字符串。
pat = '(?=([A-Z][a-z][A-Z][A-Z]))'
對於您的第二個正則表達式再次執行相同操作。
print re.findall(r"(?=([AZ][az][AZ][AZ](?=[^AZ])))",s)
有關更多見解,請參閱
1)第一次匹配后,因為第一部分已匹配,所以剩下的字符串是aDD
。
2) aDD
不滿足pat = '[AZ][az][AZ][AZ]'
因此這不是您比賽的一部分。
您應該使用這種模式
r'([A-Z]{1}[a-z]{1}[A-Z]{1})'
>>> import re
>>> str = 'AbADaDD'
>>> re.findall(r'([A-Z]{1}[a-z]{1}[A-Z]{1})', str)
['AbA', 'DaD']
你應該用
(?=(?<![A-Z])([A-Z]{1}[a-z]{1}[A-Z]{1}[A-Z]{1})(?![A-Z]))
>>> import re
>>> str = 'AbADaDD'
>>> re.findall(r'(?=(?<![A-Z])([A-Z]{1}[a-z]{1}[A-Z]{1}[A-Z]{1})(?![A-Z]))', str)
['AbAD']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.