将正则表达式展开为其可能的匹配项
项目描述
快速入门
sre_yield的目标是高效地生成给定正则表达式可以匹配的所有值,或者高效地计算可能的匹配项。它使用解析的正则表达式,因此您得到的结果比尝试仅分割字符串要准确得多。
>>> s = 'foo|ba[rz]'
>>> s.split('|') # bad
['foo', 'ba[rz]']
>>> import sre_yield
>>> list(sre_yield.AllStrings(s)) # better
['foo', 'bar', 'baz']
它通过遍历由sre_parse(与re模块内部使用的相同)构建的树来完成此操作,并根据需要构建链式/重复迭代器。尽管如此,根据您的输入字符串,可能会有重复的结果 - 这些是sre_parse没有优化的情况。
>>> import sre_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'
>>> import re
>>> re.search(s, 'kennedy') is not None # note .search
True
>>> v = sre_yield.AllStrings(s)
>>> v.__len__()
23
>>> 'bu' in v
True
>>> 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' in v2
True
捕获组
如果您对在生成值时提取会匹配的内容感兴趣,您可以使用AllMatches而不是来获取Match对象。
>>> 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,以查看是否已报告过。如果您想讨论任何事情,我们还有一个谷歌群组。
sre_yield与re模块之间的差异
当然,有一些有效的正则表达式sre_yield无法处理。这些包括诸如后视、后向引用等,但也包括一些其他异常
重复的最大值取决于系统 - 在CPython的sre模块中,有一个特殊值被处理为无限大(取决于构建,为2**16-1或2**32-1)。在sre_yield中,这被视为一个字面值,而不是无限大,因此(在2**16-1平台上)
>>> len(sre_yield.AllStrings('a*')[-1]) 65535 >>> import re >>> len(re.match('.*', 'a' * 100000).group(0)) 100000
re模块的文档说“正则表达式模式字符串可能不包含空字节”,但这似乎运行良好。
顺序不依赖于贪婪性。
正则表达式被视为fullmatch。
sre_yield被复杂的锚点使用所困惑,但支持简单的使用
>>> list(sre_yield.AllStrings('foo$')) ['foo'] >>> list(sre_yield.AllStrings('^$')) [''] >>> list(sre_yield.AllStrings('.\\b.')) # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... ParseError: Non-end-anchor None found at END state
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。