跳转到主要内容

解析表达式文法(PEG)库

项目描述

pe logo
解析表达式
PyPI link Python Support tests


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模块
  • 语法定义和解析器实现是分开的

语法概述

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 查看哈希值)

上传时间: CPython 3.12 Windows x86-64

pe-0.5.3-cp312-cp312-musllinux_1_1_x86_64.whl (995.0 kB 查看哈希值)

上传时间: CPython 3.12 musllinux: musl 1.1+ x86-64

pe-0.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB 查看哈希值)

上传时间: CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

pe-0.5.3-cp312-cp312-macosx_11_0_arm64.whl (315.5 kB 查看哈希值)

上传时间: CPython 3.12 macOS 11.0+ ARM64

pe-0.5.3-cp311-cp311-win_amd64.whl (309.9 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86-64

pe-0.5.3-cp311-cp311-musllinux_1_1_x86_64.whl (1.0 MB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ x86-64

pe-0.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ x86-64

pe-0.5.3-cp311-cp311-macosx_11_0_arm64.whl (317.4 kB 查看哈希值)

上传时间: CPython 3.11 macOS 11.0+ ARM64

pe-0.5.3-cp310-cp310-win_amd64.whl (310.2 kB 查看哈希值)

上传时间: CPython 3.10 Windows x86-64

pe-0.5.3-cp310-cp310-musllinux_1_1_x86_64.whl (951.2 kB 查看哈希值)

上传时间: CPython 3.10 musllinux: musl 1.1+ x86-64

pe-0.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (952.5 kB 查看哈希值)

上传时间: CPython 3.10 manylinux: glibc 2.17+ x86-64

pe-0.5.3-cp310-cp310-macosx_11_0_arm64.whl (316.6 kB 查看哈希值)

上传时间: CPython 3.10 macOS 11.0+ ARM64

pe-0.5.3-cp39-cp39-win_amd64.whl (310.4 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86-64

pe-0.5.3-cp39-cp39-musllinux_1_1_x86_64.whl (953.4 kB 查看哈希值)

上传时间: CPython 3.9 musllinux: musl 1.1+ x86-64

pe-0.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (956.3 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ x86-64

pe-0.5.3-cp39-cp39-macosx_11_0_arm64.whl (317.0 kB 查看哈希值)

上传时间: CPython 3.9 macOS 11.0+ ARM64

pe-0.5.3-cp38-cp38-win_amd64.whl (311.6 kB 查看哈希值)

上传时间: CPython 3.8 Windows x86-64

pe-0.5.3-cp38-cp38-musllinux_1_1_x86_64.whl (1.0 MB 查看哈希值)

上传时间: CPython 3.8 musllinux: musl 1.1+ x86-64

pe-0.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (977.9 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ x86-64

pe-0.5.3-cp38-cp38-macosx_11_0_arm64.whl (316.0 kB 查看哈希值)

上传时间: CPython 3.8 macOS 11.0+ ARM64

支持者