2012-05-06 42 views
1

當開始和結束的長度相同時,如何匹配正則表達式? 例如當開始和結束的長度相同時,匹配的正則表達式

>>> String = '[[A], [[B]], [C], [[D]]]' 
>>> Result = re.findall(pattern, String) 
>>> Result 
>>> [ '[A]', '[[B]]', '[C]', '[[D]]' ] 

目前我使用的模式\[.*?\],但它導致提前

>>> ['[[A]', '[[B]', '[C]', '[[D]'] 

感謝。

+3

我找不出你想做什麼。解釋爲什麼你的實際比賽不合格。 –

回答

4

您可以爲有限數量的開始/結束字符定義這樣的正則表達式(即「如果它以1開頭和結尾,或以2開頭和結尾等等」)。但是,您的不能爲做這個爲無限數量的字符。這只是正則表達式的一個事實。正則表達式是有限狀態機的語言,有限狀態機不能計數;至少需要下推自動機(無上下文語法)的能力。

簡單地說,正則表達式可以說:「我看見X然後我看到Ÿ」,但它不能說:「我看到X然後我看到Ÿ相同數量的時間「,因爲它不記得它看到了多少次x

然而,你可以很容易地做到這一點使用Python編程語言,這是圖靈完備的全部力量!圖靈語言完全可以計算:

>>> string = '[[A], [[B]], [C], [[D]]]' 
>>> sameBrackets = lambda s: len(re.findall('\[',s)) == len(re.findall('\]',s)) 
>>> filter(sameBrackets, string.split(", ")) 
['[[B]]', '[C]'] 
3

你不能。抱歉。

Python的正則表達式是「有限狀態自動機」的擴展,它只允許在掃描字符串時通過匹配來保留有限的內存空間。這個例子需要一個任意數量的內存,取決於有多少次重複。

Python允許超過有限狀態的唯一方法是使用「反向引用」,它可以匹配字符串的以前匹配部分的相同副本 - 但它們不允許您將某些內容與比如說相同數量的字符。

您應該嘗試手動寫入,而不是。

0

要匹配平衡括號,您需要一個recursive regular expression。該股re模塊不支持這種語法,但替代regex做:

import regex 

r = r'\[(([^\[\]]+)|(?R))*\]' 

print regex.match(r, '[[A], [[B]], [C], [[D]] ]') # ok 
print regex.match(r, '[[A], [[B]], [C , [[D]] ]') # None 

該表達式基本上說:匹配的東西用方括號,其中「東西」可以是一系列非支架([^\[\]]+)或包圍整件事再次(?R)

相關問題