将正则表达式展开为其可能的匹配项

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等,但也有一些 其他例外情况:

    >P>重复的最大值是系统相关的——CPython的^ {Tt17} $模块 有一个特殊值被视为无穷大(2**16-1或 2**32-1取决于构建)。在sre_u yield中,这被视为字面意思, 而不是无限的,因此(在2**16-1平台上):

    >>> len(sre_yield.AllStrings('a*')[-1])65535
    >>> importre>>> len(re.match('.*','a'*100000).group(0))100000
  • 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java以编程方式从TableLayout中删除所有行   Java Web Sart Ubuntu12.1。加载资源(图像)   人们如何让Java SPNEGO客户端在Windows中工作?   java Eclipselink:ObjectArrayMapping和ClassDescriptor   控制台中带有引号/空格的java Javafx命名参数   java创建服务失败:找不到对象?   java Hazelcast:如何在测试期间禁用自动发现?   使用TuckyUrlRewriteFilter rermoteaddr的java块IP   javascript如何在angular 4中进行同步http调用   输入字符串的java排列   java Jenkins不是以Xrs Xmx2048m XX:MaxPermSize=512m(windows)开始的   AWS EMR上的java avro错误   java从两个ArrayList中提取特定连接的对象,组合这些相关对象并从子类中打印   java从主题中删除什么时间点消息?   谷歌像素设备上的java InvalidKeyException   java如何在执行测试后重建项目   java Android 2.2 readUTF()socket问题   按下安卓设备上的“后退”按钮后java Toast没有完成?