【问题标题】:Python regex findall OR [duplicate]Python正则表达式findall OR [重复]
【发布时间】:2017-03-01 05:21:42
【问题描述】:

我正在编译以下模式:

pattern = re.compile("media.+\.(aac|ts)")

我的想法是获取包含在字符串中的 .ts 和 .aac 媒体文件。 媒体文件名可以是 media-u9xuxtkay_213.aac 或 media-u9xuxtkay_213.ts

根据这个接受的答案Python regular expressions OR,您可以使用 (|) 作为 OR 但我不明白这是一个可以接受的答案,因为它似乎对我有用:

In [23]: s
Out[23]: 'Sent from my iPhone'

In [24]: patt = re.compile("Sent from my (iPhone|iPod)")

In [25]: patt.findall(s)
Out[25]: ['iPhone']

所以我打电话给 findall,我得到了这个:

In [37]: media
Out[37]: 'media-u9xuxtkay_213.aac'

In [38]: pattern = re.compile("media.+\.(aac|ts)")

In [39]: pattern.findall(media)
Out[39]: ['aac']

我应该得到一个 media-u9xuxtkay_213.aac 而不是 aac。同样的方式,接受的答案应该从我的 iPhone 返回 Sent 而不是 iPhone

【问题讨论】:

  • 使用r"media.+\.(?:aac|ts)",非捕获组。
  • 那么在另一个问题中接受的答案是错误的?
  • 不,如果你将它与re.finditer 一起使用并抓住.group()。但是还有一个更方便的东西——非捕获组。
  • 可能会重复,但在查找此问题时,无法通过具有该标题的搜索引擎找到您链接的问题。
  • 我用“re.findall wierd behavior”找到了它——最佳结果。它正在成为一个非常频繁、重复的问题。顺便说一句,您使用了哪些搜索词?

标签: python regex


【解决方案1】:

括号充当“捕获组”,表示正则表达式应从字符串中选择什么。您可以使用(?: ) 使其成为非捕获组,因此它会获取整个字符串。

re.compile(r"media.+\.(?:aac|ts)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多