Detect re (regexp) object in Python
Question: I wonder what is the proper pythonic backward- and forward-compatible method
how check if an object is compiled `re` object.

`isinstance` method cannot be easily used, while the resulting object claims
to be `_sre.SRE_Pattern` object:

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

but there is no such one:

    
    
    >>> 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'
    

I don't want to use duck typing (i.e. checking for the availability of some
specific methods), because this could collide with some other types.

For now, I'm using:

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

but there might be a better way..


Answer: `re._pattern_type` exists, and appears to do what you want:

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

But this is not a good idea - per Python convention, names starting with _ are
not part of the public API of a module and not part of the backward
compatibility guarantees. So, using `type(re.compile(''))` is your best bet -
though notice that this isn't guaranteed to work either, since the re module
makes no mention of the object returned from re.compile() being of any
particular class.

And indeed, even if this was guaranteed, the most Pythonic and back- and
forward- compatible way would be to rely on the _interface_ , rather than the
type. In other words, embracing duck typing and EAFP, do something like this:

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

