正则表达式基于开始或结束模式排除行

时间:2017-11-01 14:39:15

标签: python regex

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

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

Pattern2& pattern3靠近该行的开头(这些行在技术上以>开头)。字符串末尾的Pattern1。

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

1 个答案:

答案 0 :(得分:0)

从本质上讲,你将三个较小的正则表达式组合成一个,表示匹配器可以匹配任何一个代替另一个。正如@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.+)