将正则表达式展开为其可能的匹配项
sre-yield的Python项目详细描述
快速启动
sre_yield的目标是有效地生成与 给定正则表达式,或有效地计算可能的匹配项。它使用 解析了正则表达式,因此得到的结果比尝试 把绳子分开。
>>> s='foo|ba[rz]'>>> s.split('|')# bad['foo', 'ba[rz]'] >>> importsre_yield>>> list(sre_yield.AllStrings(s))# better['foo', 'bar', 'baz']
它通过遍历由sre_parse构造的树来实现这一点 由re模块内部使用,并构造链式/重复 适当的迭代器。可能有重复的结果,这取决于 但是输入字符串–这些情况sre_parse没有优化。
>>> importsre_yield>>> list(sre_yield.AllStrings('.|a',charset='ab'))['a', 'b', 'a']
…在更简单的情况下也会发生:
>>> list(sre_yield.AllStrings('a|a'))['a', 'a']
怪癖
成员资格检查'abc' in values_obj必须完全匹配–它 必须覆盖整个字符串。假设它周围有^(...)$。 因为re.search可以匹配任意字符串中的任何位置,模拟 这将产生大量的垃圾匹配-可能不是你 想要。(如果这是您想要的,请在两边添加一个.*。
下面是一个简单的例子,使用来自http://xkcd.com/1313/
>>> s='bu|[rn]t|[coy]e|[mtg]a|j|iso|n[hl]|[ae]d|lev|sh|[lnd]i|[po]o|ls'>>> importre>>> re.search(s,'kennedy')isnotNone# note .searchTrue >>> v=sre_yield.AllStrings(s)>>> v.__len__()23 >>> 'bu'invTrue >>> v[:5]['bu', 'rt', 'nt', 'ce', 'oe']
如果您确实想模拟搜索,那么最终会得到大量匹配项 迅速地。限制重复有点帮助,但它仍然很大 号码。
>>> v2=sre_yield.AllStrings('.{,30}('+s+').{,30}')>>> el=v2.__len__()# too big for int>>> print(str(el).rstrip('L'))57220492262913872576843611006974799576789176661653180757625052079917448874638816841926032487457234703154759402702651149752815320219511292208238103 >>> 'kennedy'inv2True
捕获组
如果你有兴趣提取 值,则可以使用allmatches来获取匹配对象。
>>> v=sre_yield.AllMatches(r'a(\d)b')>>> m=v[0]>>> m.group(0)'a0b' >>> m.group(1)'0'
这甚至适用于简单的反向引用,在本例中是使用匹配的引号。
>>> v=sre_yield.AllMatches(r'(["\'])([01]{3})\1')>>> m=v[0]>>> m.group(0)'"000"' >>> m.groups()('"', '000') >>> m.group(1)'"' >>> m.group(2)'000'
报告错误等。
我们欢迎错误报告–请参阅GitHub上的问题跟踪程序,查看以前是否报告过错误。 如果你想讨论什么,我们还有一个Google Group。
sre_产量与re模块之间的差异
肯定有一些有效的正则表达式,sre_yield不 把手。其中包括lookarounds、backreference等,但也有一些 其他例外情况:
remodule docs 说“正则表达式模式字符串不能包含空字节” 然而,这似乎运作良好。
秩序不取决于贪婪。
正则表达式被视为完全匹配。
sre_yield被锚的复杂用法所迷惑,但支持简单的锚:
>>> list(sre_yield.AllStrings('foo$'))['foo'] >>> list(sre_yield.AllStrings('^$'))[''] >>> list(sre_yield.AllStrings('.\\b.'))# doctest: +IGNORE_EXCEPTION_DETAILTraceback (most recent call last): ...ParseError: Non-end-anchor None found at END state
>>> len(sre_yield.AllStrings('a*')[-1])65535 >>> importre>>> len(re.match('.*','a'*100000).group(0))100000