1

次の入力セットを一致させる必要があります。

foo_abc_bar  
foo_bar

結果として「abc」または空の文字列を取得します。

だからこれは私が書いた正規表現です:

r'foo_(abc|)[_|]bar'

しかし、何らかの理由で、これは私が与えた2番目の文字列と一致しません。

さらに調べてみると、それ[_|]は空の文字列と一致しないことがわかりました。

では、どうすればこの問題を解決できますか?

4

2 に答える 2

5

オプションにするには、疑問符演算子abc_を使用できます。

(abc_)?

したがって、正規表現全体は次のようになります。

r'foo_(abc_)?bar'

この正規表現では、2番目のアンダースコア(存在する場合)がキャプチャグループの一部になります。それが望ましくない場合は、一致後に削除するか.rstrip('_')、もう少し複雑な正規表現を使用することができます。

r'foo_(?:(abc)_)?bar'

[_|]空の文字列と一致しないことがわかりました。

それは正しい。角括弧は文字グループを示します。は、[_|]正確に1つのアンダースコアまたは正確に1つの垂直バーに一致し、他には何も一致しません。つまり、縦棒は文字グループ内に表示されると特別な意味を失います。

于 2012-11-24T07:45:16.470 に答える
1

このような文字列パターンが必要な場合

xxx_xxx_xxx
xxx_xxx

その後、あなたが必要です

([A-Za-z]{3})((_[A-Za-z]{3})+)?

しかし、これも機能します

r'foo(_abc)?_bar'

?オプションを意味します(一致する場合と一致しない場合があります)。

于 2012-11-24T07:44:55.027 に答える