【问题标题】:Method regex.scanner() cannot be found in the Python 3.5.1 documentation, but the Interpreter works well在 Python 3.5.1 文档中找不到方法 regex.scanner(),但解释器运行良好
【发布时间】:2016-09-01 17:20:32
【问题描述】:

我正在通过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()
 ......

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

【问题讨论】:

    标签: python regex python-3.x python-3.5


    【解决方案1】:

    这是hidden gem :-)

    这就是事情变得有趣的地方。在过去 15 年左右的时间里, 常规中有一个完全未记录的功能 表达引擎:扫描仪。扫描仪是 引擎在其之后保持匹配的底层 SRE 模式对象 找到下一个匹配项。甚至还有一个 re.Scanner 类 (也未记录)它建立在 SRE 模式扫描仪之上 这给了这个稍微更高级别的界面。

    re 模块中存在的扫描仪不是很有用 不幸的是,为了使“不匹配”部分更快,但看起来 在其源代码中揭示了它是如何实现的:在 SRE 之上 原语。

    【讨论】:

    • 非常感谢您的回答。我明白了问题的关键。我再次检查 Python 3.5.1 文档并在 Python 3.4 中的新增功能中找到一条语句,上面写着“已从 pydoc 模块中删除了未使用且未记录的内部 Scanner 类”。此外,还有是一种方法 regex.finditer(),可用于替换 regex.scanner()。我想在以后的工作中使用 regex.finditer(),因为它非常易于理解和记录。
    猜你喜欢
    • 2010-09-16
    • 2021-09-14
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多