如何创建一个新列表,每个元素都是python中另一个列表的每个元素的正则表达式?

时间:2012-05-05 20:38:29

标签: python list python-3.x list-comprehension

我一直在使用一些不同的语法,但似乎没有任何工作,我得到语法错误“TypeError:'str'对象不支持项目分配”和一些othes

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 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

使用列表推导,我创建了一个url列表,如果url regex结果与模式匹配,则只会将其插入到新列表中

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