Skip to main content
 首页 » 编程设计

python之分词模块

2025年05月04日11webabcd

请帮忙

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 

这是我试验过的。但我没能找到它们的意思?

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

请您参考如下方法:

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

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

>>> 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 

作为更好地描述 token 的快速调试语句,您还可以使用 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. token Id(对应类型,例如STRING、OP、NAME等)
  2. 字符串 - 此标记的实际标记文本,例如“&”或“'a string'”
  3. 输入的开始(行、列)
  4. 输入的结尾(行、列)
  5. token 所在行的全文。