2012-05-05 58 views
0

我已經與一些不同的語法,但沒有玩弄似乎工作,我已經得到了語法錯誤「類型錯誤:‘海峽’對象不支持項目分配」和幾個othes我怎樣才能創建一個新的列表與每個元素python中的另一個列表的每個元素的正則表達式?

for url in urls: 
    for i in range(len(urls)):  
    filename[i] = [re.search(r'/([.]+)(.pdf)') for url[i] in urls] 

我我也嘗試過:

for url in urls: 
    filename[i] = [re.search(r'/([.]+)(.pdf)') for url[i] in urls for i in range(len(urls))] 

和其他一些排列組合。我一直在想列表理解是實現這個目標的最好方法,但我不確定我需要使用哪種語法來實現。 請幫忙嗎?

回答

2

你在正確的軌道與列表理解,但你使它更加複雜得多,它是:

[re.search(r'/([.]+)(.pdf)', url) for url in urls] 

注意,這將是匹配的列表,如果你想要的,例如,它找到的羣體,忽略它不匹配任何網址,你可以這樣做:

[match.groups() for match in (re.search(r'/([.]+)(.pdf)', url) for url in urls) if match] 

它採用了嵌套生成器表達式做一個檢查,如果比賽已經取得,並從中提取出組,如果它有:

>>> urls = ["http://wwww.example.com/test.html", "http://www.example.com/test.pdf"] 
>>> [match.groups() for match in (re.search(r'/([^/]+)(.pdf)', url) for url in urls) if match] 
[('test', '.pdf')] 

在這裏,我對你的正則表達式做了一個小小的修改,使它適用於我的例子,這只是爲了舉例。

當然,你可以在這裏用match objects做任何你想做的事情,而不是僅僅得到match.groups()

+0

謝謝,這似乎像它應該工作,但唯一的URL正則表達式的結果只有插入新的列表問題是我的結果列表中充滿了像「_sre.SRE_Match對象在0x1544ba0」這樣的對象而我以前肯定遇到過這種情況,並且能夠將它們轉換爲字符串,現在我似乎處於困境 - 任何幫助?謝謝。 – rab777hp

+0

@ rab777hp看到我的第二個例子。 –

+0

所以我做到了,它返回了一個空的列表... – rab777hp

0

使用列表理解,我創建了一個網址列表,如果匹配模式

file_regex = re.compile(r'/([a-zA-Z0-9]+)(.pdf)') 

filenames = [file_regex.search(url) for url in urls if file_regex.match(url)] 

print filenames 
+1

這是有點浪費,因爲它將不得不兩次匹配正則表達式。 –

+0

然後編譯正則表達式... – Bryan

+0

@Brian:即使使用編譯的正則表達式,它仍然檢查匹配,然後再次找到匹配來存儲它。 –

相關問題