我在文件中搜索与python中三种可能的正则表达式模式之一不匹配的行。如果我要单独搜索每个,模式是:
pattern1 = '_[AB]_[0-9]+$'
pattern2 = 'uce.+'
pattern3 = 'ENSOFAS.+'
Pattern2& pattern3靠近该行的开头(这些行在技术上以>
开头)。字符串末尾的Pattern1。
我已经看到了将pattern2和pattern3与^>(?:(?!uce|ENSOFAS).+$)
结合起来的方式(我不确定这种格式是否正确)。如何在单个正则表达式搜索中包含pattern1。我这样做的原因是跳过与这些模式中的任何一个匹配的行。
答案 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.+)