【问题标题】:How to combine multiple regular expressions into one line?如何将多个正则表达式组合成一行?
【发布时间】:2014-08-06 17:04:41
【问题描述】:

我的脚本可以正常工作:

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 合并为一条?

我曾尝试使用| 字符,但我总是无法匹配任何内容。所以我确定我完全不知道如何正确使用它。

【问题讨论】:

  • 为什么不发布您对| 运算符的尝试?这将是要走的路。
  • 使用管道| 字符似乎可以解决问题。您可以编辑您的问题以显示您是如何使用它的吗?
  • 我认为您的示例链接的哲学和宗教性质是在您的帖子中使用假网址的原因。不过,我真的不在乎。

标签: python regex python-2.7


【解决方案1】:

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

正则表达式

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

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

Regex Tester上的演示

【讨论】:

    【解决方案2】:

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

    首先,我会在第二个正则表达式中删除\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]*
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多