0

我一直在玩一些不同的语法,但似乎没有任何效果,我遇到了语法错误“TypeError:'str' object does not support item assignment”和其他一些

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))]

还有一些其他的排列。我一直认为列表理解是执行此操作的最佳方法,但我不确定我需要使用的语法。请问有什么帮助吗?

4

2 回答 2

2

您在列表理解方面走在了正确的轨道上,但是您使它变得比现在更复杂:

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

请注意,这将是一个匹配列表,例如,如果你想要它找到的组,忽略它不匹配的任何 url,你可以这样做:

[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.groups().

于 2012-05-05T20:40:05.673 回答
0

使用列表理解,我创建了一个 url 列表,并且 url 正则表达式结果只有在匹配模式时才会插入到新列表中

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
于 2012-05-05T20:43:54.657 回答