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

2024-10-02 10:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在文件中搜索与python中三种可能的regex模式之一不匹配的行。如果我要逐个搜索,模式是:

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

Pattern2和pattern3接近行首(这些行从技术上讲是以>开始的)。字符串末尾的Pattern1。你知道吗

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


Tags: 文件字符串ab格式模式regex末尾行首
1条回答
网友
1楼 · 发布于 2024-10-02 10:24:26

实际上,您将三个较小的正则表达式组合成一个正则表达式,表示matcher可以匹配其中任何一个正则表达式来代替另一个正则表达式。一般的方法是alternation operator,正如@tallcuck所评论的那样。所以,根据他的例子和你的变量,我可以这样做:

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.+)')

你可以选择哪个更易于阅读和维护。你知道吗

最后,请注意,按照问题的最后一段建议,拉出行锚的开头(^)可能更有效,或者regex引擎可能足够聪明,可以自己完成这项工作。建议先让它工作,然后优化如果你需要。你知道吗

另一种方法是在第一个模式中添加“match anything”操作符(.*),以匹配行开头的所有三个:

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

相关问题 更多 >

    热门问题