在 Python 3.5.1 文档中找不到方法 regex.scanner(),但解释器运行良好

Zuo*_*rya 6 python regex python-3.x python-3.5

我正在使用Python Cookbook, 3rd学习 Python 。在第 67 页上,这里是这样的示例代码

import re
NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)'
NUM = r'(?P<NUM>\d+)'
PLUS = r'(?P<PLUS>\+)'
TIMES = r'(?P<TIMES>\*)'
EQ = r'(?P<EQ>=)'
WS = r'(?P<WS>\s+)'    
master_pat = re.compile('|'.join([NAME, NUM, PLUS, TIMES, EQ, WS]))
scanner = master_pat.scanner('foo = 42')
scanner.match()
 ......
Run Code Online (Sandbox Code Playgroud)

我试图在 Python 标准文档中找到方法 regex.scanner() 的签名,但我失败了。没有关于 regex.scanner() 的内容。另一方面,示例代码与解释器一起运行得很快。有人吗知道这是什么情况吗?或者这只是CPython中缺少签名细节的常见情况?

tot*_*oro 1

这是一个隐藏的宝石:-)

这就是事情变得有趣的地方。在过去 15 年左右的时间里,正则表达式引擎中有一个完全未记录的功能:扫描器。扫描器是底层 SRE 模式对象的一个​​属性,引擎在找到下一个匹配项后保持匹配。甚至还存在一个 re.Scanner 类(也未记录),它构建在 SRE 模式扫描器之上,为它提供了一个稍微更高级别的接口。

不幸的是,re 模块中存在的扫描器对于加快“不匹配”部分的速度并不是很有用,但查看其源代码可以揭示它的实现方式:在 SRE 原语之上。