正则表达式在URLS中搜索文件名时返回额外的不需要的值

时间:2014-06-22 17:59:44

标签: python regex

所以,如果我有一个字符串"http://www.images.com/place/folder/file_name.gif"

我想要一个返回的正则表达式:

"file_name.gif"

到目前为止,我有这个(在python中):

re.findall(r'([\w]+\.*?(gif|jpeg|jpg|png))',f)

但它返回

( "file_name.gif" , "gif" )

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在表达式中,您有两个捕获组。请记住,一组()是一个捕获组。您希望将扩展名和文件名组合在一个捕获组中,以便它们都返回尝试这个:

>>> exp = r'(\w+\.\w+)$'
>>> url = 'http://www.foo.com/hello.html'
>>> re.findall(exp, url)
['hello.html']

此表达式为one or more word characters, followed by a ., then one or more word characters

您可以通过添加特定扩展名来代替第二个\w来进一步增强此功能。只要你将它保存在一组()中,你就可以将表达式的整个结果作为一个匹配。

有一个基本缺陷,即像http://www.example.com/this-file.gif这样的有效网址会失败:

>>> url = 'http://www.example.com/this-link.gif'
>>> re.findall(exp, url)
['link.gif']

因为\w不包含-,这是一个有效的文件名。您可以通过在字符类中添加它来缓解此问题:

>>> exp = r'([\w-]+\.\w+)$'
>>> re.findall(exp, url)
['this-link.gif']

这是相当优雅的,因为它不匹配具有片段或查询字符串的网址。

如果您的网址没有以文件名结尾,也很容易被愚弄:

>>> url = 'http://www.example.com/this-is-a-valid-url'
>>> re.findall(exp, url)
[]

由于它专门寻找.,但它也会因此被绊倒:

>>> url = 'http://www.example.com/this.is.a.url.gif'
>>> re.findall(exp, url)
['url.gif']

你可以接受它并在其上积累,但由于很难预测除了最基本的URL结尾之外的许多组合,因此建议使用现有工具:

>>> import os
>>> import urlparse
>>> os.path.basename(urlparse.urlsplit(url).path)
'this.is.a.url.gif'

在Python 3中,使用urllib.parse