使用正则表达式搜索图像文件

时间:2011-11-23 00:52:49

标签: python regex

我有一个看起来像这样的文本文件:

[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 :(得分:3)

您正在寻找常规括号(?:...)的非捕获版本。该说明可在re module docs

中找到
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

答案 1 :(得分:3)

您可以添加另一对括号,并将?:放入内部

re.findall('/([^/]+\.(?:jpg|gif|png))', f.read())

请注意,\w与“ - ”不匹配,因此我建议[^/]+

答案 2 :(得分:0)

如果您正在寻找整个比赛,您应该能够在第0组中找到它,否则如果您正在寻找该字符串的另一部分,则可以添加额外的括号。