1. ホーム
  2. python

[解決済み] Python でコンパイルされた正規表現オブジェクトのタイプ

2023-07-10 02:37:45

質問

Pythonでコンパイルされた正規表現の型は何ですか?

特に、私は評価したい

isinstance(re.compile(''), ???)

を真とするのは、イントロスペクションのためです。

私が持っていた一つの解決策は、あるグローバルな定数 REGEX_TYPE = type(re.compile('')) とすることでしたが、あまりエレガントではないようです。

EDITです。 私がこれをしたい理由は、私は文字列のリストとコンパイルされた正規表現オブジェクトを持っているからです。私はリストに対して文字列をマッチさせたいと思います。

  • リスト内の各文字列について、文字列が等しいかどうかをチェックします。
  • リスト中のそれぞれの正規表現に対して、文字列が与えられたパターンにマッチするかどうかをチェックしようとします。

と、思いついたコードは

for allowed in alloweds:
    if isinstance(allowed, basestring) and allowed == input:
        ignored = False
        break
    elif isinstance(allowed, REGEX_TYPE) and allowed.match(input):
        ignored = False
        break

どのように解決するのですか?

何かの型がうまく指定されていない場合、何も問題はありません。 type を使って実行時に答えを見つけることは悪いことではありません。

>>> import re
>>> retype = type(re.compile('hello, world'))
>>> isinstance(re.compile('goodbye'), retype)
True
>>> isinstance(12, retype)
False
>>> 

実行時に型を発見することで、プライベートな属性にアクセスしたり、将来的に戻り値の型が変更されたりすることを防げます。 を使っても何も不都合はありません。 type を使用することについては、何も優雅なことではありませんが、型をまったく知りたくないということについては、何か優雅でないことがあるかもしれません。

とはいえ、時間の経過とともに、この質問の文脈は変化してきました。 現代のPythonのバージョンで の戻り値の型は re.compile は現在 re.Pattern .

何かの型がうまく指定されていない場合にどうするかという一般的な疑問はまだ有効ですが、この特定のケースでは、型が re.compile(...) が十分に規定されるようになりました。