【问题标题】:regex expression to exclude lines based on beginning or ending patterns正则表达式根据开始或结束模式排除行
【发布时间】:2018-04-13 22:05:48
【问题描述】:

我在文件中搜索与 python 中三种可能的正则表达式模式之一不匹配的行。如果我要单独搜索每个,模式是:

pattern1 = '_[AB]_[0-9]+$'
pattern2 = 'uce.+'
pattern3 = 'ENSOFAS.+'

模式 2 和模式 3 位于行首附近(从技术上讲,这些行以 > 开头)。 Pattern1 在字符串的末尾。

我已经看到了将 pattern2 和 pattern3 与 ^>(?:(?!uce|ENSOFAS).+$) 之类的组合的方法(我不确定这是否格式正确)。我怎样才能在单个正则表达式搜索中包含 pattern1 。我这样做的原因是跳过与这些模式中的任何一种匹配的行。

【问题讨论】:

  • 你应该可以做到(pattern1 | pattern2 | pattern3)
  • ^>(?:ENSOFAS|uce).+|^.*_[AB]_[0-9]+$?

标签: python regex


【解决方案1】:

本质上,您将三个较小的正则表达式组合成一个,表示匹配器可以匹配其中任何一个来代替另一个。正如@TallChuck 评论的那样,一般方法是alternation operator。因此,为了与他的示例和您的变量保持一致,我可能会这样做:

pattern1 = '_[AB]_[0-9]+$'
pattern2 = '^>uce.+'
pattern3 = '^>ENSOFAS.+'
re_pattern = '(?:{}|{}|{})'.format(pattern1, pattern2, pattern3)
your_re = re.compile( re_pattern )

没有理由不能在每个子模式中包含行首锚^,所以我已经这样做了。同时,您的示例使用了分组(非捕获)运算符,即 `(?:...),所以我在这里也模仿了它。

上面的内容与您一次将它们放在一起完全相同:

your_re = re.compile('(?:_[AB]_[0-9]+$|^>uce.+|^>ENSOFAS.+)')

您或您的团队选择哪个更易读和更易于维护。

最后,请注意,如问题的最后一段所建议的那样,拉出行锚 (^) 的开头可能会更有效,或者正则表达式引擎可能足够聪明,可以自行完成。建议先让它工作,然后再优化如果你需要

另一种选择是通过简单地将“匹配任何内容”运算符 (.*) 添加到第一个模式来匹配行首的所有三个:

^(?:.*_[AB]_[0-9]+$|>uce.+|>ENSOFAS.+)

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多