实现分词器的 Pythonic 方式

标签 python coding-style tokenize

我打算用 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/

相关文章:

python mysql.connector 模块使用错误的 IP 地址

python - JSON 获取嵌套字典中的键路径

c++ - 如何更改一段代码的缩进等?

python - 如何使用 Django 流式传输 HttpResponse

python - 如何将文件重命名为文件名中的子字符串?

c - 为什么在 C 中声明一个只包含数组的结构?

android - 如何更改 AlertDialog 中列表项的文本颜色

java - Camel,使用字段条件分割带有 header 的大型 XML 文件

c - 在 C 中的 strtok() 中包括 '\'

php - 捕获 token_get_all (Tokenizer) 抛出的错误