簡體   English   中英

Python正則表達式匹配已匹配的子字符串

[英]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']

DEMO

對於第二個,您應該使用否定先行和后置斷言,如下所示,

(?=(?<![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']

DEMO

第二個正則表達式的問題是, [^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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM