标记化modu

2024-07-05 14:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮忙

在模块标记化中有许多标记,如字符串、反引号、amperqual等

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

这就是我试验过了。但是我不明白他们的意思?在

据我所知,我需要立即解决。在


Tags: 模块字符串标记testimportsrctokensource
3条回答

各种AMPER、BACKQUOTE等值对应于python令牌/运算符的相应符号的令牌号。ie AMPER=&;(与号),amperqual=“&;=”。在

然而,你其实不必在意这些。它们由内部C标记器使用,但是python包装器简化了输出,将所有运算符符号转换为OP标记。您可以使用令牌模块的toküu 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中没有出现,所以不要依赖它来生成代码,但是作为对令牌含义的快速了解,您可能会发现它很有用:

^{pr2}$

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

  1. 令牌Id(对应于类型,如字符串、操作、名称等)
  2. 字符串-此标记的实际标记文本,例如“&;”或“a string”
  3. 输入中的开始(行、列)
  4. 输入中的结尾(行、列)
  5. 标记所在行的全文。在

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

您需要阅读python的代码tokenizer.c来理解细节。 只需搜索你想知道的关键字。应该不难。在

相关问题 更多 >