标记化模块

时间:2009-05-13 08:31:23

标签: python tokenize

请帮忙

模块标记化中有许多标记,如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

这就是我的实验。但我无法找到他们的意思?

从那里我将理解这一点。我需要立即解决。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

各种AMPER,BACKQUOTE等值对应于python令牌/运算符的相应符号的标记号。即AMPER =&amp; (&符号),AMPEREQUAL =“&amp; =”。

但是,你实际上并不需要关心这些。它们由内部C tokeniser使用,但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. 字符串 - 此令牌的实际令牌文本,例如“&amp;”或“'一个字符串'”
  3. 输入中的开头(行,列)
  4. 输入中的结尾(行,列)
  5. 令牌所在行的全文。

答案 2 :(得分:2)

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