解析表达式文法(PEG)库
项目描述
pe是一个用于解析表达式的库,包括解析表达式文法(PEG)。它旨在将解析表达式的表现力与正则表达式的熟悉性结合起来。例如
>>> import pe
>>> pe.match(r'"-"? [0-9]+', '-38') # match an integer
<Match object; span=(0, 3), match='-38'>
语法可以用于更复杂或递归的模式
>>> float_parser = pe.compile(r'''
... Start <- INTEGER FRACTION? EXPONENT?
... INTEGER <- "-"? ("0" / [1-9] [0-9]*)
... FRACTION <- "." [0-9]+
... EXPONENT <- [Ee] [-+]? [0-9]+
... ''')
>>> float_parser.match('6.02e23')
<Match object; span=(0, 7), match='6.02e23'>
快速链接
功能和目标
- 语法符号与标准PEG向后兼容,只有少数扩展
- 规范描述了解析的语义效果(例如,将表达式映射到函数调用)
- 解析器通常比其他解析库更快,有时快得多;请参阅基准测试
- API直观且熟悉;它基于标准API的re模块
- 语法定义和解析器实现是分开的
- 优化目标是抽象语法定义
- 有多种解析器可供选择(目前有packrat用于递归下降和machine用于迭代“解析机器”,如Medeiros和Ierusalimschy,2008所述,并在LPeg中实现)。
语法概述
pe向后兼容标准PEG语法,并且对扩展较为保守。
# terminals
. # any single character
"abc" # string literal
'abc' # string literal
[abc] # character class
# repeating expressions
e # exactly one
e? # zero or one (optional)
e* # zero or more
e+ # one or more
e{5} # exactly 5
e{3,5} # three to five
# combining expressions
e1 e2 # sequence of e1 and e2
e1 / e2 # ordered choice of e1 and e2
(e) # subexpression
# lookahead
&e # positive lookahead
!e # negative lookahead
# (extension) capture substring
~e # result of e is matched substring
# (extension) binding
name:e # bind result of e to 'name'
# grammars
Name <- ... # define a rule named 'Name'
... <- Name # refer to rule named 'Name'
# (extension) auto-ignore
X < e1 e2 # define a rule 'X' with auto-ignore
使用解析表达式匹配输入
当解析表达式匹配输入时,它返回一个Match
对象,这与Python的re模块中的正则表达式类似。默认情况下,不捕获任何内容,但捕获操作符(~
)发出匹配表达式的子字符串,类似于正则表达式的捕获组。
>>> e = pe.compile(r'[0-9] [.] [0-9]')
>>> m = e.match('1.4')
>>> m.group()
'1.4'
>>> m.groups()
()
>>> e = pe.compile(r'~([0-9] [.] [0-9])')
>>> m = e.match('1.4')
>>> m.group()
'1.4'
>>> m.groups()
('1.4',)
值绑定
值绑定提取匹配的发出值,并将其与一个名称关联起来,该名称在Match.groupdict()
字典中可用。这与正则表达式的命名捕获组类似,但它提取发出值而不是绑定表达式的子字符串。
>>> e = pe.compile(r'~[0-9] x:(~[.]) ~[0-9]')
>>> m = e.match('1.4')
>>> m.groups()
('1', '4')
>>> m.groupdict()
{'x': '.'}
动作
动作(也称为“语义动作”)是可调用的,用于转换解析结果。当给定任意函数时,它按以下方式调用
func(*match.groups(), **match.groupdict())
该函数调用的结果成为向前发出的唯一值,并且所有绑定值都被清除。
为了获得更多控制,pe提供了Action类和许多子类以供各种用途。这些动作可以访问更多关于解析结果的信息,并对匹配有更多的控制。例如,Pack类接受一个函数,并使用发出值打包成列表来调用它
func(match.groups())
而Join类将所有发出的字符串与分隔符连接起来
func(sep.join(match.groups()), **match.groupdict())
自动忽略
可以定义语法,使得某些规则忽略序列项之间的模式的出现。最常见的是,这用于忽略空白,因此默认的忽略模式是简单的空白。
>>> pe.match("X <- 'a' 'b'", "a b") # regular rule does not match
>>> pe.match("X < 'a' 'b'", "a b") # auto-ignore rule matches
<Match object; span=(0, 3), match='a b'>
此功能可以帮助使语法更易于阅读。
示例
这里是一种解析逗号分隔整数列表的方法
>>> from pe.actions import Pack
>>> p = pe.compile(
... r'''
... Start <- "[" Values? "]"
... Values <- Int ("," Int)*
... Int < ~( "-"? ("0" / [1-9] [0-9]*) )
... ''',
... actions={'Values': Pack(list), 'Int': int})
>>> m = p.match('[5, 10, -15]')
>>> m.value()
[5, 10, -15]
类似项目
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
pe-0.5.3.tar.gz (200.9 kB 查看哈希)
构建的发行版
pe-0.5.3-cp312-cp312-win_amd64.whl (305.4 kB 查看哈希值)
pe-0.5.3-cp312-cp312-macosx_11_0_arm64.whl (315.5 kB 查看哈希值)
pe-0.5.3-cp311-cp311-win_amd64.whl (309.9 kB 查看哈希值)
pe-0.5.3-cp311-cp311-macosx_11_0_arm64.whl (317.4 kB 查看哈希值)
pe-0.5.3-cp310-cp310-win_amd64.whl (310.2 kB 查看哈希值)
pe-0.5.3-cp310-cp310-macosx_11_0_arm64.whl (316.6 kB 查看哈希值)
pe-0.5.3-cp39-cp39-win_amd64.whl (310.4 kB 查看哈希值)
pe-0.5.3-cp39-cp39-musllinux_1_1_x86_64.whl (953.4 kB 查看哈希值)
pe-0.5.3-cp39-cp39-macosx_11_0_arm64.whl (317.0 kB 查看哈希值)
pe-0.5.3-cp38-cp38-win_amd64.whl (311.6 kB 查看哈希值)
pe-0.5.3-cp38-cp38-macosx_11_0_arm64.whl (316.0 kB 查看哈希值)
关闭
pe-0.5.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a772dccb588b12e21668a6e0ad43669faaf81541cfcab177326efe46ffdcc336 |
|
MD5 | 35c181d99c1a2fd48ce8a5d245217c7b |
|
BLAKE2b-256 | cec0c0531092e28bde1e132698b52da432b4483d5cd35c55a5359ea8f03839ae |
关闭
哈希值 for pe-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9cde71eee35468a079b7ca449406797a436cabbd08be4671e58da7f48ae13a93 |
|
MD5 | ab0df6efc986fa89f384007a9ab4c165 |
|
BLAKE2b-256 | 547b819ebed5d4b54fa95ed7a3282251d40afffbcf566bb303de6756839c69fc |
关闭
哈希值 for pe-0.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 26f39bf8b239a3fd278be809b129bcc1429237ae4c12d902c84c91fd102e8d0a |
|
MD5 | ef3566195187af60b3fba8b2cff98d3c |
|
BLAKE2b-256 | d6c360643f28c0cea9d3536fdba6607a8812e22e0027d0b83f89acc641740a45 |
关闭
哈希值 for pe-0.5.3-cp311-cp311-musllinux_1_1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 329b971d070cf81270f83ae361f7eb35d04ff65df871fab03667d0a9202bc890 |
|
MD5 | 5fc00a983025f72daef44d9336f058d8 |
|
BLAKE2b-256 | d7aa22354684b03b54ff6d3e88cc29d8e7d08f1ac4aec86b0125d818224301cb |
关闭
哈希值 for pe-0.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 058506986a523983c3a868a1b395b96554432e3ee945439c3fee29f317b75b5f |
|
MD5 | ea82c38ae51b8aeeaa69b7c3501d21d6 |
|
BLAKE2b-256 | a96961365b5194b10bd5e34561ae912720039912277cd0e0c4dd50a1adc5a509 |
关闭
哈希值 for pe-0.5.3-cp310-cp310-musllinux_1_1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8d19044156616a6494394cebfa7f824fa53a2f79a9c9d9d2dc94ca9629d7859e |
|
MD5 | 4903d02562f2bce24816649fb4825174 |
|
BLAKE2b-256 | e73ffa5a43895da50a8218d77d419c09a611a6cf206e341e0498d13318d4173e |
关闭
哈希值 for pe-0.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2dc1fab2eda5525beec5a8cb437e404c3fe962aa2d12ab06111d93b9bf463976 |
|
MD5 | a612ed437eab0278bf750910ca93ccca |
|
BLAKE2b-256 | 1d7f77769944156bae69f518935a62a6d50f2185d9bca07ea7a0053948be47a5 |
关闭
哈希值 用于 pe-0.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 445236aa4c0d714248e0bcdfd17c57562cbfb9f17d4b9543305dd3ec95897e77 |
|
MD5 | 3f2377effe3a9b148643412c11f60841 |
|
BLAKE2b-256 | 456085d2528de684df2101eb599b5c360e288d8e02c1b0090b9c116b682c59b2 |
关闭
哈希值 用于 pe-0.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fb6e467762dcbb4b9c0a27f027eb48834c4d072a2f5000d7a3594e0fa74ab43d |
|
MD5 | 99745734661701fbe7d7755aeb292a3e |
|
BLAKE2b-256 | b990044277138be874f76cbc322ffcaa4d56a6662ff3639068b478328ff10fd6 |