1

请帮忙

模块标记化中有许多标记,如 STRING、BACKQUOTE、AMPEREQUAL 等。

>>> import cStringIO
>>> import tokenize
>>> source = "{'test':'123','hehe':['hooray',0x10]}"
>>> src = cStringIO.StringIO(source).readline
>>> src = tokenize.generate_tokens(src)
>>> src
<generator object at 0x00BFBEE0>
>>> src.next()
(51, '{', (1, 0), (1, 1), "{'test':'123','hehe':['hooray',0x10]}")
>>> token = src.next()
>>> token
(3, "'test'", (1, 1), (1, 7), "{'test':'123','hehe':['hooray',0x10]}")
>>> token[0]
3
>>> tokenize.STRING
3
>>> tokenize.AMPER
19
>>> tokenize.AMPEREQUAL
42
>>> tokenize.AT
50
>>> tokenize.BACKQUOTE
25

这就是我尝试过的。但我无法找到它们的意思?

从哪里我会明白这一点。我需要一个立即的解决方案。

4

3 回答 3

4

各种 AMPER、BACKQUOTE 等值对应于 python 标记/运算符的适当符号的标记编号。即 AMPER = &(与号),AMPEREQUAL = "&="。

但是,您实际上不必关心这些。它们由内部 C 标记器使用,但 python 包装器简化了输出,将所有运算符符号转换为OP标记。您可以使用令牌模块的 tok_name 字典将符号令牌 ID(每个令牌元组中的第一个值)转换为符号名称。例如:

>>> import tokenize, token
>>> s = "{'test':'123','hehe':['hooray',0x10]}"
>>> for t in tokenize.generate_tokens(iter([s]).next):
        print token.tok_name[t[0]],

OP STRING OP STRING OP STRING OP OP STRING OP NUMBER OP OP ENDMARKER

作为更好地描述令牌的快速调试语句,您还可以使用 tokenize.printtoken。这是未记录的,并且看起来它在 python3 中不存在,因此不要依赖它来生成生产代码,但作为对令牌含义的快速浏览,您可能会发现它很有用:

>>> for t in tokenize.generate_tokens(iter([s]).next):
        tokenize.printtoken(*t)

1,0-1,1:        OP      '{'
1,1-1,7:        STRING  "'test'"
1,7-1,8:        OP      ':'
1,8-1,13:       STRING  "'123'"
1,13-1,14:      OP      ','
1,14-1,20:      STRING  "'hehe'"
1,20-1,21:      OP      ':'
1,21-1,22:      OP      '['
1,22-1,30:      STRING  "'hooray'"
1,30-1,31:      OP      ','
1,31-1,35:      NUMBER  '0x10'
1,35-1,36:      OP      ']'
1,36-1,37:      OP      '}'
2,0-2,0:        ENDMARKER       ''

您为每个令牌返回的元组中的各种值按顺序排列:

  1. 令牌 ID(对应于类型,例如 STRING、OP、NAME 等)
  2. 字符串 - 此标记的实际标记文本,例如“&”或“'a string'”
  3. 输入中的开始(行、列)
  4. 输入中的结尾(行、列)
  5. 令牌所在行的全文。
于 2009-05-14T08:52:08.310 回答
3

您需要阅读 python 的代码tokenizer.c以了解详细信息。只需搜索您想知道的关键字。应该不难。

于 2009-05-13T08:43:01.573 回答
2

Python 的词法分析(包括标记)记录在http://docs.python.org/reference/lexical_analysis.html。正如http://docs.python.org/library/token.html#module-token所说,“有关语言语法上下文中名称的定义,请参阅 Python 发行版中的文件 Grammar/Grammar。”。

于 2009-05-13T08:44:21.710 回答