shlex
shlex - 简单的词法分析
1.5.2版本的新功能。
源代码:
Lib / shlex.py
本shlex
类可以很容易地编写简单的语法类似的Unix外壳的词法分析器。这对编写微型语言(例如,在Python应用程序的运行控制文件中)或解析带引号的字符串通常很有用。
在Python 2.7.3之前,这个模块不支持Unicode输入。
shlex
模块定义了以下功能:
shlex.split(s[, comments[, posix]])
拆分字符串小号
使用shell的语法。如果注释
是False
(默认),则给定字符串中的注释
解析将被禁用(将实例的commenters
属性设置shlex
为空字符串)。该函数默认在POSIX模式下运行,但如果posix
参数为false ,则使用非POSIX模式。
2.3版本的新功能。
在版本2.6中更改:添加了posix
参数。
注意
由于split()
功能实例化一个shlex
实例,传递None
用于小号
将读取的字符串从标准输入分裂。
该shlex
模块定义了以下类:
class shlex.shlex([instream[, infile[, posix]]])
一个shlex
实例或子类实例是一个词法分析器对象。初始化参数(如果存在)指定从哪里读取字符。它必须是带有read()
和readline()
方法的文件/流对象,或者一个字符串(从Python 2.3开始接受字符串)。如果没有提供任何参数,则会从中提取输入sys.stdin
。第二个可选参数是文件名字符串,它设置infile
属性的初始值。如果instream
参数省略或等于sys.stdin
,则此第二个参数默认为“stdin”。的POSIX
论点在Python 2.3引入,并且限定操作模式。当posix
不正确(默认)时,shlex
实例将以兼容模式运行。在POSIX
模式下运行时,shlex
将尝试尽可能接近POSIX
shell解析规则。
另请参阅
Module
ConfigParser
解析器提供类似于Windows .ini
文件的配置文件。
1. shlex对象
一个shlex
实例有以下方法:
shlex.get_token()
返回一个令牌。如果令牌已经堆叠使用push_token()
,将令牌从堆栈中弹出。否则,从输入流中读取一个。如果读取遇到立即文件结束,eof
则返回(''
非POSIX模式和None
POSIX模式下的空字符串()。
shlex.push_token(str)
将参数推入令牌堆栈。
shlex.read_token()
阅读原始令牌。忽略回推堆栈,不解释源请求。(这通常不是一个有用的入口点,并且仅在此处为了完整而记录。)
shlex.sourcehook(filename)
当shlex
检测到一个源请求时(见source
下面),这个方法被赋予下面的标记作为参数,并且期望返回一个由文件名和打开的文件类对象组成的元组。
通常,这种方法首先将任何引号从参数中删除。如果结果是绝对路径名,或者以前的源请求没有生效,或者以前的源是流(如sys.stdin
),则结果将保留。否则,如果结果是一个相对路径名,紧接在源包含堆栈之前的文件的名称的目录部分被预置(这种行为就像C预处理器处理的方式#include "file.h"
)。
操作的结果被视为文件名,并作为元组的第一个元素返回,并open()
调用它以产生第二个组件。(注意:这与实例初始化中的参数顺序相反!)
该钩子已公开,因此您可以使用它来实现目录搜索路径,添加文件扩展名以及其他名称空间黑客。没有相应的'关闭'钩子,但shlex实例close()
在返回EOF时会调用源输入流的方法。
要更加明确地控制源码堆栈,请使用push_source()
和pop_source()
方法。
shlex.push_source(stream[, filename])
将输入源流推入输入堆栈。如果指定了文件名参数,稍后将在错误消息中使用。这与该方法内部使用的sourcehook()
方法相同。
2.1版本中的新功能。
shlex.pop_source()
弹出输入堆栈中最后推送的输入源。当词法分析器在叠加输入流上达到EOF时,这与内部使用的方法相同。
2.1版本中的新功能。
shlex.error_leader([file[, line]])
此方法以Unix C编译器错误标签的格式生成错误消息引导程序; 格式是'"%s", line %d: '
,其中%s
用当前源文件的名称和%d
当前输入行号替换(可选参数可用于覆盖它们)。
提供这种便利是为了鼓励shlex
用户以Emacs和其他Unix工具所理解的标准可解析格式生成错误消息。
shlex
子类的实例具有一些公共实例变量,这些变量既可以控制词法分析,也可以用于调试:
shlex.commenters
被识别为评论初学者的字符串。从注释初学者到行尾的所有字符都被忽略。包括'#'
默认情况下。
shlex.wordchars
将积累成多字符标记的字符串。默认情况下,包含所有ASCII字母数字和下划线。
shlex.whitespace
将被视为空白并跳过的字符。空格限制令牌。默认情况下,包括空格,制表符,换行符和回车符。
shlex.escape
将被视为逃脱的字符。这将仅用于POSIX模式,并且仅包括'\'
默认值。
2.3版本的新功能。
shlex.quotes
将被视为字符串的字符。令牌会累积,直到再次遇到相同的引号(因此,不同的引号类型会像在shell中一样保护彼此)。缺省情况下,包含ASCII单引号和双引号。
shlex.escapedquotes
quotes
那里的字符将解释在中定义的转义字符escape
。这仅在POSIX模式下使用,并且仅包括'"'
默认值。
2.3版本的新功能。
shlex.whitespace_split
如果True
,令牌只会被分割成空格。例如,这对解析命令行很有用,以shlex
类似于shell参数的方式获取令牌。
2.3版本的新功能。
shlex.infile
当前输入文件的名称,最初在类实例化时设置或由后来的源请求堆叠。在构建错误消息时检查这一点可能很有用。
shlex.instream
此shlex
实例正在读取字符的输入流。
shlex.source
该属性是None
默认的。如果您为其分配字符串,则该字符串将被识别为与source
各种shell中的关键字类似的词法级别包含请求。也就是说,紧随其后的标记将作为文件名打开,输入将从该流中取出,直到EOF,此时close()
将调用该流的方法,输入源将再次成为原始输入流。源请求可以被堆叠到任意深度级别。
shlex.debug
如果此属性是数字1
或更多,则shlex
实例将在其行为上输出详细的进度输出。如果你需要使用它,你可以阅读模块源代码来了解详细信息。
shlex.lineno
源代码行数(迄今为止看到的换行数加1)。
shlex.token
令牌缓冲区。在捕捉异常时检查这一点可能很有用。
shlex.eof
用于确定文件结束的令牌。这将被设置为空字符串(''
),非POSIX模式和None
POSIX模式。
2.3版本的新功能。
2.解析规则
在非POSIX模式下运行时,shlex
会尝试遵守以下规则。
- 引号字符在单词中不被识别(
Do"Not"Separate
被解析为单个单词Do"Not"Separate
);
- 转义字符不被识别;
- 用引号将字符括起来保留引号内所有字符的字面值;
- 关闭引号分开单词(
"Do"Separate
被解析为"Do"
和Separate
);
- 如果
whitespace_split
是False
,任何未声明为单词字符,空格或引号的字符将作为单字符标记返回。如果是这样True
,shlex
只会将空格分割成空格;
- EOF用空字符串(
''
)表示。
- 即使引用了空字符串也不可能解析。
在POSIX模式下运行时,shlex
会尝试遵守以下解析规则。
- 行情被剥离出来,不要分开单词(
"Do"Not"Separate"
被解析为单个单词DoNotSeparate
);
- 非引号转义字符(例如
'\'
)保留下一个字符的字面值;
- 将引号中的字符括起来
escapedquotes
(例如"'"
)保留引号内所有字符的字面值;
- 将引号中的字符括起来
escapedquotes
(例如'"'
)保留引号内的所有字符的字面值,除了在中提到的字符escape
。转义字符只有在后面跟着使用的引号或转义字符本身时才保留其特殊含义。否则,转义字符将被视为正常字符。
- EOF通过一个
None
值发送信号;
- 引用空字符串(
''
)是允许的;