前提
「退屈なことはPythonにやらせよう」7章14節
re.IGNORECASEとre.DOTALLとre.VERBOSEを組み合わせる より
re.compile()は、第2引数に1つの値しかとりません。
このような場合は、re.IGNORECASEやre.DOTALLやre.VERBOSEを、縦線記号(|)で結合します。
この文脈での|は「論理和演算子」として働きます。
したがって、大文字と小文字を区別せず、ドット文字を改行にマッチさせたい場合には、re.compile()を次のように呼び出します。Python3
1some_regex_value = re.compile(正規表現,re.IGNORECASE | re.DOTALL)
3つのオプションを全部指定するには、次のように書きます。
Python3
1some_regex_value = re.compile(正規表現,re.IGNORECASE | re.DOTALL | re.VERBOSE)
この記法は、初期のPythonから引き継いだ若干時代遅れのものです。論理和については本書の範囲を超えるので、詳細はhttps://wiki.python.org/moin/BitwiseOperators/(英文)を参照してください。
環境
Windows10
Python 3.7.4 64-bit
質問
1.
なぜ&でなくて|なのでしょうか。
どちらでもいいのか、あるいは|でないといけない理由があるのでしょうか?
画像2枚目のように図にすると|の場合黒斜線、&の場合赤斜線の部分になるはずで、
極端な話、Regexオブジェクトを生成する度に2/3の確率でre.Iかre.Sいずれかが無効になってmo == Noneになったりしないのはなぜですか?
2.
この記法は、初期のPythonから引き継いだ若干時代遅れのものです。
について、では新しい記法ではどのように書くのが好ましいのでしょうか?
解決後記、皆様御回答ありがとうございます
まとめ
- re.IGNORECASE、re.DOTALL、re.VERBOSEなどはビットフラグ。
|
はビット和演算子。- ビット演算子は2進数表現の各桁同士に対してブール演算を行う。
2進数を数値ではなく大量のON/OFFスイッチが並んでいると捉えると、
何故なんのためにビット演算をするのか突然理解できました。
つまり大量の0が並ぶ中唯一何桁目が1なのかでフラグが立つ/立たないを区別しているだけの記号なのであって、
RegexFlag.VERBOSE
が64であるとかRegexFlag.IGNORECASE
が2であるとか、
10進数に直すと結果的にそうなっているだけで、数値の大小自体に優劣等の特別な意味合いがあるわけではないのですね。
以下に参考にしたソースを付記します
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/26 08:32
2020/02/27 09:02 編集
2020/02/27 09:32
2020/02/28 05:01 編集