所以,如果我有一个字符串"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" )
我做错了什么?
答案 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
。