2014-07-13 66 views
4

我正在試驗正則表達式,我已經讀了一些斷言和看到的例子,但由於某種原因,我無法得到這個工作..我試圖讓後面的模式使用下面的模式向後看。在Python中使用正則表達式斷言

import re 
s = '123abc456someword 0001abde19999anotherword' 
re.findall(r'(?<=\d+[a-z]+\d+)[a-z]+', s, re.I) 

結果應該是somewordanotherword

,但我得到error: look-behind requires fixed-width pattern

讚賞任何幫助。

+0

就像它說的那樣;它期望你爲固定寬度的字符提供輸入,而不是動態的。嘗試使用'{#}'而不是'? + *'等 –

+1

從錯誤中可以看出,後視需要固定寬度的圖案。 – Braj

+0

我在文檔中看到,現在我閱讀它.. – Jackson

回答

3

將其轉換爲Non-capturing group,並從指數得到匹配的組1

(?:\d+\w+\d+)(\w+\b) 

這裏是DEMO

如果您只對[a-z]感興趣,請將\w更改爲[a-z]以上述正則表達式模式。這裏添加\b以確定字邊界的位置。

示例代碼:

import re 
p = re.compile(ur'(?:\d+\w+\d+)(\w+\b)', re.IGNORECASE) 
test_str = u"123abc456someword 0001abde19999anotherword" 

re.findall(p, test_str) 
+0

謝謝你,這工作得很好。 – Jackson

4

Python的re模塊只允許固定長度字符串使用後視。如果您想嘗試,能在正則表達式使用可變長度的樣子,屁股,使用替代regex模塊:

>>> import regex 
>>> s = '123abc456someword 0001abde19999anotherword' 
>>> regex.findall(r'(?i)(?<=\d+[a-z]+\d+)[a-z]+', s) 
['someword', 'anotherword'] 

或者乾脆避免使用一般向後看,並使用捕獲組()

>>> import re 
>>> s = '123abc456someword 0001abde19999anotherword' 
>>> re.findall(r'\d+[a-z]+\d+([a-z]+)', s, re.I) 
['someword', 'anotherword'] 
+0

我不知道有一個正則表達式模塊,所以你可以使用它來做到這一點?我將不得不嘗試安裝這個模塊並玩弄它。 – Jackson

+0

是的,當然可以=) – hwnd

+0

爲神話般的'正則表達式'模塊+1(和捕獲組的替代方案,這是引擎的一般解決方案,無後視):) – zx81

0

另一種簡單的方法通過先行

>>> import re 
>>> s = '123abc456someword 0001abde19999anotherword' 
>>> m = re.findall(r'[a-z]+(?= |$)', s, re.I) 
>>> m 
['someword', 'anotherword'] 

它的一個或多個字母,其中以下字符必須是線的空間或結束相匹配。