使用正则表达式搜索图像文件
我有一个文本文件,内容大概是这样的:
[22/Nov/2011 12:57:58] "GET /media/js/jquery-1.4.3.min.js HTTP/1.1" 304 0
[22/Nov/2011 12:57:58] "GET /media/js/fancybox/fancybox-x.png HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /media/js/fancybox/fancybox-y.png HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /media/js/fancybox/blank.gif HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /ajax/pages/erlebnisse/ HTTP/1.1" 200 563
[22/Nov/2011 12:58:00] "GET /erlebnisse/alle-erlebnisse/ HTTP/1.1" 200 17114
我想用正则表达式来找出所有出现的图片文件(.gif、.jpg、.png)。所以从上面的文本中,我想得到的结果是:
['fancybox-x.png', 'fancybox-y.png', 'blank.gif']
我做的事情是:
re.findall('\w+\.(jpg|gif|png)', f.read())
所以我的模式是:
一个或多个字母数字字符
(\w+)
后面跟一个点(\.)
,然后是 'jpg'、'gif' 或 'png'(jpg|gif|png)
。
这个方法确实有效,但让我困惑的是,括号的内容(我只是用来“分组”)被当成了 group(1)
,所以结果是:
['png', 'png', 'gif']
这个结果是对的,但不完整。换句话说,我想知道,我该如何让 re.findall()
区分“分组”用的括号和用来指定组的括号?
3 个回答
0
如果你想找到整个匹配的内容,可以在第0组里找到它。如果你想找字符串的其他部分,可以加上额外的小括号。
3
你可以再加一对括号,然后在里面用?:
re.findall('/([^/]+\.(?:jpg|gif|png))', f.read())
注意,\w
是匹配不了“-”这个符号的,所以我建议你用[^/]+
。
3
你在寻找一种不捕获的普通括号版本 (?:...)
。相关的描述可以在 re模块文档 中找到。
s ='''[22/Nov/2011 12:57:58] "GET /media/js/jquery-1.4.3.min.js HTTP/1.1" 304 0
[22/Nov/2011 12:57:58] "GET /media/js/fancybox/fancybox-x.png HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /media/js/fancybox/fancybox-y.png HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /media/js/fancybox/blank.gif HTTP/1.1" 304 0
[22/Nov/2011 12:57:59] "GET /ajax/pages/erlebnisse/ HTTP/1.1" 200 563
[22/Nov/2011 12:58:00] "GET /erlebnisse/alle-erlebnisse/ HTTP/1.1" 200 17114'''
import re
for m in re.findall('([-\w]+\.(?:jpg|gif|png))', s):
print m