python - pyparsing 异常说明:需要更准确的错误位置信息
问题描述
这是一段产生异常的代码:
from pyparsing import *
strg = 'ab3jh-lokdk-12345-lopf9$ab3jh-lokdk-12345-lopfr'
# strg = 'ab3jh-lokdk-12345-lopf9$ab3jh-lokdk-12345-lopf9'
D = Suppress('-')
TYPE_1 = Regex('\w{2}\d\w{2}').setName('tp1')
TYPE_2 = Regex('\w{5}').setName('tp2')
TYPE_3 = Regex('\d{5}').setName('tp3')
TYPE_4 = Regex('\w{4}\d').setName('tp4')
ELM = Group(TYPE_1 + D + TYPE_2 + D + TYPE_3 + D + TYPE_4).setName('elm')
ALL = ELM + (Literal('$')+ELM)[...]
try:
result = ALL.parseString(strg,parseAll=True)
except ParseException as parse_err:
print(parse_err.explain())
打印的异常说明如下:
ab3jh-lokdk-12345-lopf9$ab3jh-lokdk-12345-lopfr
^
ParseException: Expected end of text, found '$' (at char 23), (line:1, col:24)
pyparsing.core.StringEnd - StringEnd
正如人们所看到的,错误显示在美元符号上,而实际上它位于最后一个字符上。有没有办法pyparsing
指出错误的实际位置(意思是第二组的最后一个字符)?
解决方案
是的,pyparsing 有时会冒泡异常。您可以通过使用“-”运算符而不是“+”来覆盖它,以表示“如果在此处之后存在解析不匹配,请不要备份并尝试其他操作”。它引发了 aParseSyntaxException
而不是ParseException
,因此要捕获它们,您需要执行 except ParseBaseException
。
在您的解析器中,尝试替换ELM
为:
ELM = Group(TYPE_1 + D - TYPE_2 + D + TYPE_3 + D + TYPE_4).setName('elm')
它基本上是在说“一旦你看到TYPE_1
和”-“,最好有一个有效的ELM
,如果没有,那就是一个语法错误。” 不过不要太过分,只需将每个“+”替换为“-” - 只需在您希望解析器致力于解析该表达式的其余部分或放弃异常的地方执行此操作。
推荐阅读
- excel - Excel VBA - 循环工作表,复制单元格,粘贴到新工作表中
- windows - 如何在我的 Mac 上的 Windows 平台上使用 Bazel 运行 Go 代码?
- python - 我们如何将每 n 行转置为 spark scala 中的列,如下所示
- angular - 从 ngFor 中获取一个值以用作嵌套形式的参数
- email - 用户填写阿拉伯语时接收电子邮件时出现问题
- clickhouse - 代码:306。DB::Exception:从 localhost:9000 接收。DB::Exception:堆栈大小太大。堆栈地址
- django - 覆盖外部 Django 包中的 view.py 文件
- python - 使用 Python 访问 Amazon EC2 服务器上的文件
- java - Firebase 数据库中的多个等于
- reactjs - 第一次取数据成功,第二次取数据不成功