我打算用 Python 实现分词器,我想知道您是否可以提供一些风格建议?
我之前用 C 和 Java 实现了分词器,所以我对理论没问题,我只是想确保我遵循 Pythonic 风格和最佳实践。
列出代币类型:
例如,在 Java 中,我会有一个字段列表,如下所示:
public static final int TOKEN_INTEGER = 0
但是,很明显,(我认为)无法在 Python 中声明一个常量变量,所以我只能用普通变量声明替换它,但我认为这不是一个很好的解决方案,因为声明可以更改。
从标记器返回标记:
是否有更好的替代方法来简单地返回一个元组列表,例如
[ (TOKEN_INTEGER, 17), (TOKEN_STRING, "Sixteen")]?
干杯,
皮特
最佳答案
re
模块中有一个未记录的类,名为 re.Scanner
。用于分词器非常简单:
import re
scanner=re.Scanner([
(r"[0-9]+", lambda scanner,token:("INTEGER", token)),
(r"[a-z_]+", lambda scanner,token:("IDENTIFIER", token)),
(r"[,.]+", lambda scanner,token:("PUNCTUATION", token)),
(r"\s+", None), # None == skip token.
])
results, remainder=scanner.scan("45 pigeons, 23 cows, 11 spiders.")
print results
会导致
[('INTEGER', '45'),
('IDENTIFIER', 'pigeons'),
('PUNCTUATION', ','),
('INTEGER', '23'),
('IDENTIFIER', 'cows'),
('PUNCTUATION', ','),
('INTEGER', '11'),
('IDENTIFIER', 'spiders'),
('PUNCTUATION', '.')]
我使用 re.Scanner 仅用几百行就编写了一个非常漂亮的配置/结构化数据格式解析器。
关于实现分词器的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691148/