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

时间:2014-06-16 19:44:14

标签: python regex python-2.7

我的脚本可以正常工作:

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 个答案:

答案 0 :(得分:6)

如评论中所述,a pipe (|)应该可以解决问题。

正则表达式

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

捕获两种模式中的任何一种。

Regex Tester上的演示

答案 1 :(得分:1)

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

对于初学者,我会在第二个正则表达式中删除\S*?。除了有很多回溯的机会之外,它没有用处。

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

其他想法

你可以通过在第一个中使用一个小的lookbehind来摆脱捕获组,允许你摆脱所有的括号并直接匹配你想要的。不是更快,但更整洁:

(?<=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]*