2017-11-01 13 views
0

pythonで3つの可能な正規表現パターンのいずれかと一致しない行をファイルで検索しています。私は個別に検索した場合、パターンは以下のとおりです。正規表現。開始パターンまたは終了パターンに基づいて行を除外します。

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

パターン2パターン3 &(これらの行は、技術的に>で始まる)行の先頭付近にあり。文字列の最後にPattern1。

私はpattern2とpattern3を^>(?:(?!uce|ENSOFAS).+$)のようなものに組み合わせる方法を見てきました(正しくフォーマットされているかどうかはわかりません)。パターン1を1つの正規表現検索に含めるにはどうしたらいいですか?私がこれをやっている理由は、これらのパターンのいずれかと一致する行をスキップすることです。

+1

(PATTERN1 |パターン2 |パターン3) ' – TallChuck

+0

' ^>(?: ENSOFAS | uce)。+ | ^。* _ [AB] _ [0-9] + $ '? – ctwheels

答えて

0

本質的に、3つの小さな正規表現を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.+)') 

がお好きなところをお選びください。

最後に、あなたの質問の最後の段落が示唆されているように、行のアンカー(^)の先頭を取り出すほうが効率的かもしれないことに注意してください。最初に動作させることを提案したら、が必要な場合はを最適化してください。

別のオプションは、単に第1パターンに「何でも一致」演算子(.*)を追加することにより、行の先頭に3つすべてを一致させることです:あなたは `だけで行うことができるはず

^(?:.*_[AB]_[0-9]+$|>uce.+|>ENSOFAS.+) 
関連する問題