如何忽略pyparsing的ParseException并继续进行?

2024-04-25 21:43:44 发布

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

我想忽略文件中与所有预定义解析器都不匹配的行,然后继续。我想忽略的行的范围很广,我无法为它们中的每一行检查和定义解析器。你知道吗

我使用try..except和pass,一旦捕获到ParseException。但是,解析立即停止。你知道吗

try:
    return parser.parseFile(filename, parse_all)

except ParseException, err:
    msg = 'Error during parsing of {}, line {}'.format(filename, err.lineno)
    msg += '\n' + '-'*70 + '\n'
    msg += err.line + '\n'
    msg += ' '*(err.col-1) + '^\n'
    msg += '-'*70 + '\n' + err.msg
    err.msg = msg

    print(err.msg)
    pass

即使出现异常,我也希望继续。你知道吗


Tags: 文件parser解析器return定义linemsgpass
1条回答
网友
1楼 · 发布于 2024-04-25 21:43:44

Pyparsing实际上没有“continueonerror”选项,因此您需要调整解析器,以便它不会首先引发ParseException。您可以尝试将| SkipTo(LineEnd())('errors*')之类的内容添加到解析器中,作为最后一招。然后,您可以查看errors results名称来查看哪些行出错了(或者向该表达式添加一个解析操作来捕获更多的行)。你知道吗

import pyparsing as pp

era = "The" + pp.oneOf("Age Years") + "of" + pp.Word(pp.alphas)

era.runTests("""
    The Age of Enlightenment
    The Years of Darkness
    The Spanish Inquisition
    """)

印刷品:

The Age of Enlightenment
['The', 'Age', 'of', 'Enlightenment']

The Years of Darkness
['The', 'Years', 'of', 'Darkness']

The Spanish Inquisition
    ^
FAIL: Expected Age | Years (at char 4), (line:1, col:5)

添加这些行并再次调用runTests:

# added to handle lines that don't match
unexpected = pp.SkipTo(pp.LineEnd(), include=True)("no_one_expects")
era = era | unexpected

印刷品:

The Age of Enlightenment
['The', 'Age', 'of', 'Enlightenment']

The Years of Darkness
['The', 'Years', 'of', 'Darkness']

The Spanish Inquisition
['The Spanish Inquisition']
 - no_one_expects: 'The Spanish Inquisition'

相关问题 更多 >

    热门问题