2012-05-05 60 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:即使使用编译的正则表达式,它仍然检查匹配,然后再次找到匹配来存储它。 –

相关问题