2009-12-13 55 views
0

我試圖創建的正則表達式,從以下部分文本過濾器創建正則表達式:在Python

amd64 build of software 1:0.98.10-0.2svn20090909 in archive 

什麼我想提取的是:

software 1:0.98.10-0.2svn20090909 

我該怎麼做??我一直想,這是我到目前爲止有:

p = re.compile('([a-zA-Z0-9\-\+\.]+)\ ([0-9\:\.\-]+)') 
iterator = p.finditer("amd64 build of software 1:0.98.10-0.2svn20090909 in archive") 
for match in iterator: 
    print match.group() 

與結果:

software 1:0.98.10-0.2 

svn20090909丟失)

非常感謝。

+2

你能詳細說明你想捕捉的確切東西嗎?應該捕捉什麼,什麼不是,準確地改變什麼? – Ikke 2009-12-13 18:29:40

+0

你應該不使用原始字符串還是使用反斜線加倍? – 2009-12-13 18:49:19

回答

3

這將工作:

p = re.compile(r'([a-zA-Z0-9\-\+\.]+)\ ([0-9][0-9a-zA-Z\:\.\-]+)') 
iterator = p.finditer("amd64 build of dvdrip software 1:0.98.10-0.2svn20090909 in archive") 
for match in iterator: 
    print match.group() 
# Prints: software 1:0.98.10-0.2svn20090909 

通過允許捕獲部分包含字母,同時仍然堅持它以數字開頭的作品。

沒有看到需要匹配的所有其他字符串,我不能確定這是否足夠好。

0

如果您想要一件作品,請勿使用捕獲組。

+0

我想捕獲組:) – user175259 2009-12-13 18:31:01

+0

然後,你應該知道他們是如何工作的:) – 2009-12-13 18:40:38

3

如果你有一致的線,這是,如果每一項都是在同一行,你想第一個字始終是數字部分之前(1:0.98 ... ...一部分)你並不需要一個正則表達式。嘗試:

>>> s = 'amd64 build of software 1:0.98.10-0.2svn20090909 in archive' 
>>> match = [s.split()[3], s.split()[4]] 
>>> print match 
['software', '1:0.98.10-0.2svn20090909'] 
>>> # alternatively 
>>> match = s.split()[3:5] # for same result 

什麼這是做如下:它首先分割線s在空間(使用字符串方法split()),並且選擇結果列表的第四和第五元素;兩者都存儲在變量match中。

同樣,這隻適用於每行有一個條目並且'software'部分始終位於1:0.98.10-0.2svn20090909部分之前。

我經常避免使用正則表達式來處理分割列表。如果解析成爲一場噩夢,我使用pyparsing

+0

真棒!這也幫助我:) – user175259 2009-12-13 23:40:08