python中已编译正则表达式对象的类型

python中已编译正则表达式对象的类型,python,regex,types,Python,Regex,Types,python中编译的正则表达式的类型是什么 特别是,我想评估一下 isinstance(re.compile(''), ???) 诚然,出于内省的目的 我的一个解决方案是,使用一些全局常量REGEX_TYPE=typre.compile,但它看起来不是很优雅 编辑:我想这样做的原因是因为我有字符串列表和已编译的正则表达式对象。我想根据列表匹配一个字符串 对于列表中的每个字符串,请尝试检查字符串是否相等。 对于列表中的每个正则表达式,尝试检查字符串是否与给定模式匹配。 我想出的代码是: for

python中编译的正则表达式的类型是什么

特别是,我想评估一下

isinstance(re.compile(''), ???)
诚然,出于内省的目的

我的一个解决方案是,使用一些全局常量REGEX_TYPE=typre.compile,但它看起来不是很优雅

编辑:我想这样做的原因是因为我有字符串列表和已编译的正则表达式对象。我想根据列表匹配一个字符串

对于列表中的每个字符串,请尝试检查字符串是否相等。 对于列表中的每个正则表达式,尝试检查字符串是否与给定模式匹配。 我想出的代码是:

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

如果没有很好地指定某事物的类型,那么在运行时使用内置类型来发现答案没有什么错:

>>> import re
>>> retype = type(re.compile('hello, world'))
>>> isinstance(re.compile('goodbye'), retype)
True
>>> isinstance(12, retype)
False
>>> 
在运行时发现该类型可以保护您不必访问私有属性,并防止将来更改返回类型。在这里使用类型并没有什么不雅之处,尽管想要知道类型可能有一些不雅之处

也就是说,随着时间的推移,这个问题的背景发生了变化。对于Python的当代版本,现在是


如果没有很好地指定某事物的类型,那么应该怎么做的一般问题仍然有效,但是在这个特殊情况下,re.compile的类型。。。现在已经很明确了。

预防胜于治疗。首先不要创建这样一个异构列表。拥有一组允许的字符串和一组已编译的正则表达式对象。这将使您的检查代码看起来更好,运行更快:

if input in allowed_strings:
    ignored = False
else:
    for allowed in allowed_regexed_objects:
        if allowed.match(input):
            ignored = False
            break
如果您无法避免创建这样的列表,请查看是否有机会对其进行一次检查并构建两个替换对象。

免责声明:这并不是为了直接满足您的特定需求,而是作为一种替代方法可能有用的东西

您可以遵循duck类型的理念,并使用hasattr确定对象是否具有您想要利用的某些属性。例如,您可以执行以下操作:

if hasattr(possibly_a_re_object, "match"): # Treat it like it's an re object
    possibly_a_re_object.match(thing_to_match_against)
else:
    # alternative handler

仅供参考,BeautifulSoup中有一个这样的代码示例,它使用了“hasattr”技术。 根据替代方法的精神,您还可以通过以下操作将字符串搜索封装在regexp中: regexp=re.compilere.escapeyour\u字符串
因此,只有正则表达式的列表。

作为多态性的说明,另一种解决方案是创建实现公共方法的包装类

class Stringish (str):
    def matches (self, input):
        return self == input

class Regexish (re):
    def matches (self, input):
        return self.match(input)
现在,您的代码可以完全透明地迭代包含实例化这两个类之一的对象的允许列表:

for allowed in alloweds:
    if allowed.matches(input):
        ignored = False
        break

还请注意,虽然可以对原始代码进行重构以单独修复,但有些代码重复会消失。

可以将编译后的正则表达式与're.\u pattern\u type'进行比较

import re
pattern = r'aa'
compiled_re = re.compile(pattern)
print isinstance(compiled_re, re._pattern_type)

>>True
至少在2.7版中,Python 3.5引入了该模块。其中包括一个_类型别名

从Python 3.6开始,您只需执行以下操作:

from typing import Pattern

my_re = re.compile('foo')
assert isinstance(my_re, Pattern)
在3.5中,曾经有一条要求您这样做的规定:

assert issubclass(type(my_re), Pattern)
根据文档和测试套件,它不能保证工作。

这不是问题的另一个答案,但它解决了问题。除非您的_字符串包含正则表达式特殊字符

if re.match(your_string,target_string):
具有与相同的效果

if your_string == target_string:
因此,请后退一步,在允许的规则列表中使用未编译的正则表达式模式。这无疑比使用编译后的正则表达式慢,但它只适用于偶尔出现的意外结果,并且只有在3.7中允许用户提供允许的项时,才可以使用re.Pattern:

进口稀土 rr=re.compilepattern isinstancerr,关于模式 >>真的
Python是关于管道类型的。这违反了Python的精神。如果您确实需要检查类型,那么这可能是最好的方法。就我所记得的,只有re._pattern_type可能因为某种原因以下划线开头。ad.matchinput???你的意思是允许。matchinput?@ultimatebuster:或者duck taping:我喜欢这样:每次我有一个问题,不管是多么具体或模糊,都会有一个这样的答案。我还不如搜索SO而不是Google。这里的_sre模块没有这样的属性。@AndreasJung“没有这样的属性”意味着从_sre导入sre_模式不起作用。反对票可能是1票。因为你的态度:“我不在乎”——什么?二,。因为您实际上没有回答这个问题。使用这种方法发现的类型并不总是正确的-一个实现可能会使用一个或多个类型来支持给定的功能。不太可能使用正则表达式,但是一些工厂现在可能返回一种类型,以后可能返回许多类型。但这只是通过检查类型来打破duck类型支持期望的另一种形式。这与任何其他类型有何不同?在Python中调用的任何内容都可能返回其他内容。
这就是为什么想要知道这种类型可能有一些不雅之处。@Rosh:这是对OP问题的一个务实的回答。让·保罗最后确实说这不是一个好的做法,但作为一个直接的回答,这是一个好的做法++这并没有回答这个问题这可能是最明智的答案。for循环可以简化为忽略=不允许任何。允许的对象中允许的匹配输入。这个答案是建设性的,这是好的,但它没有回答原始问题。这个错误似乎在2016-09-27已经修复,根据链接问题。我必须使用from键入导入模式才能访问模式。@Rotareti谢谢,typing.re在3.6中被删除,我想出于某种原因我真的很喜欢这个答案。这确实突出了如何利用duck类型来保持pythonicity和抽象性。我还需要一个类似的通用文本搜索,其中搜索谓词可以是要匹配的字符串列表,也可以是正则表达式。我可能会将str更改为basestring,因为在Py2中,unicode和str都从basestring继承。不幸的是,在Py27中不起作用,re是一个无类模块,不能简单地用类继承模型进行扩展。您可以解决这个问题,它不必从re继承;最重要的是要有一个名称相同的方法,有两个不同的实现。是的,对于Regexish,从对象继承,然后只需调用re in u init u_u_u_u以通过组合创建re对象,因为正如您所说,您只需要实现匹配或搜索。这是处理此问题的理想方法,非常感谢!类型暗示现在是一件事:
if re.match(your_string,target_string):
if your_string == target_string: