Python正则表达式在集合内匹配
在使用http://gskinner.com/RegExr/这个在线正则表达式测试工具时,正则表达式[jpg|bmp]
可以找到包含“jpg”或“bmp”的结果。但是,当我在Python中运行这个正则表达式时,它只返回“j”或“b”。我该怎么做才能让这个正则表达式完整匹配“jpg”或“bmp”这两个单词呢?可能之前有人问过这个问题,但我不太确定该怎么提问才能找到答案。谢谢!!!
如果有帮助的话,这里是整个正则表达式
"http://www\S*(?i)\\.(jpg|bmp|png|gif|img|jng|jpeg|jpe|gif|giff)"
这个正则表达式的主要目的是在网址中查找图片。
3 个回答
http://some.link.com/path/to/file.jpg
http://some.link.com/path/to/another.png
如果你想在一堆网址中找出符合特定模式的网址,可以使用:
urls = [ 'http://some.link.com/path/to/file.jpg',
'http://some.link.com/path/to/another.png',
'http://and.another.place.com/path/to/not-image.txt',
]
这样就会输出
import re
for url in urls:
if re.match(r'http://.*(jpg|png|gif)$'):
print url
re.match()
会检查字符串开头是否有匹配的内容,对于前两个链接会返回一个 匹配对象,而第三个链接则返回 None
,表示没有匹配。
如果你只想获取文件扩展名,可以使用下面的代码:
for url in urls:
m = re.match(r'http://.*(jpg|png|gif)$')
print m.group(0)
这样会打印出
('jpg',)
('png',)
你只会得到扩展名,因为这部分是被定义为一个组的。
如果你需要在一大段文本中找到网址(比如从 wget 返回的内容),你需要使用 re.search()
,并把你感兴趣的部分用 ( )
括起来。例如:
response = """dlkjkd dkjfadlfjkd fkdfl kadfjlkadfald ljkdskdfkl adfdf
kjakldjflkhttp://some.url.com/path/to/file.jpgkaksdj fkdjakjflakdjfad;kadj af
kdlfjd dkkf aldfkaklfakldfkja df"""
reg = re.search(r'(http:.*/(.*\.(jpg|png|gif)))', response)
print reg.groups()
这样会打印出
('http://some.url.com/path/to/file.jpg', 'file.jpg', 'jpg',)
或者你也可以用 re.findall
或 re.finditer
来替代 re.search
,这样可以获取长文本中的所有网址,而搜索只会返回第一个。
当你使用 []
时,你是在创建一个字符类,这个类包含了方括号内的所有字符。
所以你并不是在匹配 jpg
或 bmp
,而是在匹配 j
、p
、g
或者 |
等等。
你应该在你的正则表达式中添加一个锚点,以确保它匹配字符串的结尾。
http://www\S*(?i)\\.(jpg|bmp|png|gif|img|jng|jpeg|jpe|gif|giff)$
^ ^^
如果你需要双重转义,那么在你的模式中的每个地方都要这样做。
http://www\\S*(?i)\\.(jpg|bmp|png|gif|img|jng|jpeg|jpe|gif|giff)$
这样可以确保它检查文件名是否在字符串的最后部分。
使用 (jpg|bmp)
代替方括号。
方括号的意思是 - 匹配方括号内的某个字符。
编辑一下 - 你可能想要这样的东西: [^ ].*?(jpg|bmp)
或者 [^ ].*?\.(jpg|bmp)