2011-07-15 26 views
1

我寫在Python執行下面的函數解析一個純文本文件負向後斷言表達:相當於(*)在背後斷言負看看正則表達式的Python

不匹配任何遵循HTTP後: // * ** * ** * ** *;但是當它是不是一個HTTP內將匹配模式:// *鏈接

Example: 
http://www.test.com/aa4 cd6 
bx2 vq9 
yu9 http://www.bh9.com/cj3 

Matches: cd6,bx2,vq9 and yu9 

所以,我想正則表達式像

r'(?<!http://(.*))([a-z][a-z][0-9])' 
r'(?<!http://*)([a-z][a-z][0-9])' 

他們沒有工作。

如何添加。*或做類似的操作在Python的負面看後面斷言正則表達式。

回答

2

問題:回顧後不允許模式,其長度是不固定的。

快速入侵:或許下列正則表達式可以完成這項工作?

r'(?<![./])[a-z][a-z][0-9]' 

它的工作原理是這樣的:

>>> str = """http://www.test.com/aa4 
... bx2 vq9 
... http://www.bh9.com/cj3 
... """ 
>>> re.findall(r'(?<![./])[a-z][a-z][0-9]',str) 
['bx2', 'vq9'] 

或者 - 作爲另一種解決方案 - 使用正則表達式匹配的URL切斷所有URL字符串中的,然後搜索r'[a-z][a-z][0-9]'

+0

如何[。 /]執行功能? – thinkcool

+0

@thinkcool:'[./]'匹配一個圓點或斜線。即在我的答案中呈現的正則表達式匹配不遵循點或斜線的所有單詞'[a-z] [a-z] [0-9]'。 – phynfo

+0

當模式緊跟在[。]或[./]後面會發生什麼,它不會與.fd3相匹配。有沒有什麼萬無一失的解決方案? – thinkcool

1

這是不可能的。 Python只允許固定長度的lookbehinds。這意味着後視裏沒有量詞。

看到這裏的功能列表上egular-expressions.info