如何将多个正则表达式合并成一行?

2 投票
2 回答
8565 浏览
提问于 2025-04-18 09:59

我的脚本这样运行得很好:

images = re.findall("src.\"(\S*?media.tumblr\S*?tumblr_\S*?jpg)", doc)
videos = re.findall("\S*?(http\S*?video_file\S*?tumblr_[a-zA-Z0-9]*)", doc)

不过,我觉得这样在整个文档中搜索两次效率不高。

如果有帮助的话,这里有一个示例文档:http://pastebin.com/5kRZXjij

我希望从上面的内容得到以下输出:

images = http://37.media.tumblr.com/tumblr_lnmh4tD3sM1qi02clo1_500.jpg
videos = http://bassrx.tumblr.com/video_file/86319903607/tumblr_lo8i76CWSP1qi02cl

其实这样做会更好:

image_and_video_links = re.findall(" <match-image-links-or-video links> ", doc)

我该如何把两个 re.findall 的行合并成一行呢?

我试过用 | 这个符号,但总是匹配不到任何东西。所以我肯定对如何正确使用它感到很困惑。

2 个回答

1

如果你真的想要高效...

首先,我建议去掉第二个正则表达式中的 \S*?。这个部分没有什么用处,只会让程序在匹配时反复回溯,浪费时间。

src.\"(\S*?media.tumblr\S*?tumblr_\S*?jpg)|(http\S*?video_file\S*?tumblr_[a-zA-Z0-9]*)

其他建议

你可以通过在第一个正则表达式中使用一个小的向后查找,来去掉捕获组,这样就能省去所有的括号,直接匹配你想要的内容。虽然速度没有变快,但看起来更整洁:

(?<=src.\")\S*?media.tumblr\S*?tumblr_\S*?jpg|http\S*?video_file\S*?tumblr_[a-zA-Z0-9]*

你是想让 srcmedia 后面的句号表示“任何字符”,还是表示“一个字面上的句号”?如果是后者,就要用反斜杠转义它们: \.

你可以使用 re.IGNORECASE 选项,这样就可以省去一些字母:

(?<=src.\")\S*?media.tumblr\S*?tumblr_\S*?jpg|http\S*?video_file\S*?tumblr_[a-z0-9]*
6

正如评论中提到的,a pipe (|)可以解决这个问题。

这个正则表达式

(src.\"(\S*?media.tumblr\S*?tumblr_\S*?jpg))|(\S*?(http\S*?video_file\S*?tumblr_[a-zA-Z0-9]*))

可以匹配这两种模式中的任意一种。

你可以在这个链接上查看示例:正则表达式测试器

撰写回答