Python 如何忽略PyParseException并继续?

Python 如何忽略PyParseException并继续?,python,text-processing,pyparsing,Python,Text Processing,Pyparsing,我想忽略文件中与所有预定义解析器不匹配的行,然后继续。我想忽略的行的范围很广,我无法为它们中的每一行检查和定义解析器 我使用try..但在捕获ParseException时使用pass。但是,解析立即停止 try: return parser.parseFile(filename, parse_all) except ParseException, err: msg = 'Error during parsing of {}, line {}'.format(filename,

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

我使用try..但在捕获ParseException时使用pass。但是,解析立即停止

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

即使存在ParseException,我也希望继续操作。

Pyparsing实际上没有“出错时继续”选项,因此您需要调整解析器,使其不会首先引发ParseException。您可以尝试在解析器中添加类似于
|SkipTo(LineEnd())('errors*)
的内容,作为最后一搏。然后您可以查看errors results名称,查看哪些行出错(或者向该表达式添加一个解析操作,以捕获不只是当前行的内容)

印刷品:

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)
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'
添加以下行并再次调用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
    ^
FAIL: Expected Age | Years (at char 4), (line:1, col:5)
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'

您所说的解析立即停止是什么意思。?你的意思是你的程序完全退出了吗?或者是否提出了另一个例外?如果是后者,请发布新的回溯。还有一个小细节:您不需要在except块的末尾传递
pass
。@That1我想继续文件解析,而不是带着异常错误优雅地退出。我要求澄清-您说“解析立即停止”是什么意思?它是否因为程序退出而停止?还是因为另一个错误而停止?你有什么收获吗?您在print语句中看到字符串了吗?当解析器有一个
ZeroOrMore
或一个
OneOrMore(可能与空字符串匹配的表达式)
表达式最终永远旋转时,通常会发生这种情况。尝试在一个解析器表达式上添加
setDebug()
,或者如果有以下任何一个表达式,则向解析操作添加一些输出。除此之外,你可能还需要发布更多细节。哈!
SkipTo()
还必须解析
LineEnd()
,这在默认情况下是不需要的。添加
include=True
以获取此信息。答案已编辑。另外,将
pp.ZeroOrMore(规则)
更改为
pp.OneOrMore(规则)
。这也是dictOf中的一个bug,它会使解析器永远旋转。但您可能不得不将此作为一个新问题发布—您的代码示例不容易理解,因此不喜欢对给定问题进行长时间的讨论。谢谢Paul。我在另一个帖子中详细地问了这个问题。