我有一个像这样的文本文件:
[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']
与是对的,但不完整。换句话说,我在问,,如何使区分“分组”括号和括号来分配组呢?
发布于 2011-11-22 16:58:26
您正在寻找常规括号(?:...)
的非捕获版本。该描述可在再模块文档中获得。
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
发布于 2011-11-22 17:00:14
您只需添加另一对括号,并将?:用于内部括号。
re.findall('/([^/]+\.(?:jpg|gif|png))', f.read())
请注意,\w
不匹配"-",所以我建议[^/]+
发布于 2011-11-22 16:57:05
如果您正在寻找整个匹配项,您应该能够在组0中找到它,否则,如果要查找字符串的另一部分,则可以添加额外的括号。
https://stackoverflow.com/questions/8236020
复制