Python正则表达式在集合内匹配

6 投票
3 回答
12639 浏览
提问于 2025-04-16 23:36

在使用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 个回答

0
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.findallre.finditer 来替代 re.search,这样可以获取长文本中的所有网址,而搜索只会返回第一个。

3

当你使用 [] 时,你是在创建一个字符类,这个类包含了方括号内的所有字符。

所以你并不是在匹配 jpgbmp,而是在匹配 jpg 或者 | 等等。

你应该在你的正则表达式中添加一个锚点,以确保它匹配字符串的结尾。

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)$

这样可以确保它检查文件名是否在字符串的最后部分。

5

使用 (jpg|bmp) 代替方括号。

方括号的意思是 - 匹配方括号内的某个字符。

编辑一下 - 你可能想要这样的东西: [^ ].*?(jpg|bmp) 或者 [^ ].*?\.(jpg|bmp)

撰写回答