Подтвердить что ты не робот

Обнаружить объект re (regexp) в Python

Интересно, что такое правильный пифонический метод обратной и прямой совместимости, как проверить, скомпилирован ли объект re.

isinstance метод не может быть легко использован, в то время как результирующий объект утверждает, что он _sre.SRE_Pattern object:

>>> import re
>>> rex = re.compile('')
>>> rex
<_sre.SRE_Pattern object at 0x7f63db414390>

но такого не существует:

>>> import _sre
>>> _sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> import sre
__main__:1: DeprecationWarning: The sre module is deprecated, please import re.
>>> sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> re.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

Я не хочу использовать утиную печать (т.е. проверять наличие определенных методов), потому что это может столкнуться с некоторыми другими типами.

В настоящее время я использую:

>>> RegexpType = type(re.compile(''))
>>> type(rex) == RegexpType
True

но может быть лучший способ.

4b9b3361

Ответ 1

re._pattern_type существует и, как представляется, делает то, что вы хотите:

>>> isinstance(re.compile(''), re._pattern_type)
True

Но это не очень хорошая идея: в соответствии с соглашением на Python имена, начинающиеся с _, не являются частью публичного API модуля, а не являются частью гарантий обратной совместимости. Таким образом, использование type(re.compile('')) - ваш лучший выбор - хотя обратите внимание, что это тоже не гарантируется, так как модуль re не упоминает об объекте, возвращенном из re.compile(), какого-либо конкретного класса.

И действительно, даже если бы это было гарантировано, большинство Pythonic и обратно-совместимых способов было бы полагаться на интерфейс, а не на тип. Другими словами, обнимая утиную печать и EAFP, сделайте что-то вроде этого:

try:
     rex.match(my_string)
except AttributeError:
     # rex is not an re
else:
     # rex is an re

Ответ 2

В подобном вопросе ответа не было, кроме решения, которое вы используете, поэтому я думаю, что лучшего способа нет.

Ответ 3

import re

print isinstance(<yourvar>, re.RE_Pattern)

Ответ 4

Следуя некоторым рекомендациям, вы можете придумать:

import re

# global constant
RE_TYPE = re.compile('').__class__

def is_regex(a):
    return isinstance(a, RE_TYPE)