我一直在使用一些不同的语法,但似乎没有任何工作,我得到语法错误“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))]
以及其他一些排列。我一直在想列表理解是最好的方法,但是我不确定我需要使用的语法。 有什么帮助吗?
答案 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