我有一个看起来像这样的文本文件:
[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()
区分“分组”括号和括号来分配组?
答案 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组中找到它,否则如果您正在寻找该字符串的另一部分,则可以添加额外的括号。