次の入力セットを一致させる必要があります。
foo_abc_bar
foo_bar
結果として「abc」または空の文字列を取得します。
だからこれは私が書いた正規表現です:
r'foo_(abc|)[_|]bar'
しかし、何らかの理由で、これは私が与えた2番目の文字列と一致しません。
さらに調べてみると、それ[_|]
は空の文字列と一致しないことがわかりました。
では、どうすればこの問題を解決できますか?
オプションにするには、疑問符演算子abc_
を使用できます。
(abc_)?
したがって、正規表現全体は次のようになります。
r'foo_(abc_)?bar'
この正規表現では、2番目のアンダースコア(存在する場合)がキャプチャグループの一部になります。それが望ましくない場合は、一致後に削除するか.rstrip('_')
、もう少し複雑な正規表現を使用することができます。
r'foo_(?:(abc)_)?bar'
[_|]
空の文字列と一致しないことがわかりました。
それは正しい。角括弧は文字グループを示します。は、[_|]
正確に1つのアンダースコアまたは正確に1つの垂直バーに一致し、他には何も一致しません。つまり、縦棒は文字グループ内に表示されると特別な意味を失います。
このような文字列パターンが必要な場合
xxx_xxx_xxx
xxx_xxx
その後、あなたが必要です
([A-Za-z]{3})((_[A-Za-z]{3})+)?
しかし、これも機能します
r'foo(_abc)?_bar'
?
オプションを意味します(一致する場合と一致しない場合があります)。