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

2 投票
3 回答
7075 浏览
提问于 2025-04-17 06:53

我有一个文本文件,内容大概是这样的:

[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

撰写回答