如何将多个正则表达式合并成一行?
我的脚本这样运行得很好:
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]*
你是想让 src
和 media
后面的句号表示“任何字符”,还是表示“一个字面上的句号”?如果是后者,就要用反斜杠转义它们: \.
你可以使用 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]*))
可以匹配这两种模式中的任意一种。
你可以在这个链接上查看示例:正则表达式测试器