Python MatchFirst未传递到第二个ParseExpression?

Python MatchFirst未传递到第二个ParseExpression?,python,pyparsing,Python,Pyparsing,当第一个ParseExpression似乎应该失败时,MatchFirst似乎不会传递到下一个ParseExpression 我有一个文件(从OrCAD中提取BOM表),该文件有一个标题、包含零部件信息的行和零件参照的续行: (命名为test_string_body,制表符用于元件部分的间距) 对于解析我使用的完整行: grammer_line_full = (LineStart() + Word(nums, min=1)('cmpt_item') +

当第一个ParseExpression似乎应该失败时,MatchFirst似乎不会传递到下一个ParseExpression

我有一个文件(从OrCAD中提取BOM表),该文件有一个标题、包含零部件信息的行和零件参照的续行:

(命名为test_string_body,制表符用于元件部分的间距)

对于解析我使用的完整行:

grammer_line_full = (LineStart() + Word(nums, min=1)('cmpt_item') + 
                     Word(nums)('cmpt_part_num') + 
                     Word(nums)('cmpt_qty') +
                     Word(printables)('cmpt_value') +
                     Word(alphanums + '_')('cmpt_footprint') +
                     Word(alphanums + ',')('cmpt_references1')
                    )
对于续行:

grammer_line_short = White('\t', exact=5) + Word(alphanums + ',')('cmpt_references2')
如果我设置:

grammer_body = grammer_line_full
或者我设定:

grammer_body = grammer_line_short 
我得到了我期望的结果(只是适当的行):

如果我设置:

grammer_body = grammer_line_full | grammer_line_short
我只知道整条线

grammer_line_full或grammer_line_full | grammer_line_short:

['1', '177347', '5', '100P', 'capc1608_is0603n', 'C1,C2,C3,C4,C5']
['2', '176054', '9', '1.0uF', 'capc3216_is1206n', 'C6,C23,C32,C88,C95,C98,']
['3', '177606', '31', '100P', 'capc1005_is0402n', 'C7,C8,C9,C10,C11,C12,C13,']...
['\t\t\t\t\t', 'C99,C140,C141']
['\t\t\t\t\t', 'C14,C15,C16,C53,C56,C64,']
['\t\t\t\t\t', 'C69,C261,C262,C263,C268,']...
仅语法线短:

['1', '177347', '5', '100P', 'capc1608_is0603n', 'C1,C2,C3,C4,C5']
['2', '176054', '9', '1.0uF', 'capc3216_is1206n', 'C6,C23,C32,C88,C95,C98,']
['3', '177606', '31', '100P', 'capc1005_is0402n', 'C7,C8,C9,C10,C11,C12,C13,']...
['\t\t\t\t\t', 'C99,C140,C141']
['\t\t\t\t\t', 'C14,C15,C16,C53,C56,C64,']
['\t\t\t\t\t', 'C69,C261,C262,C263,C268,']...
如果我删除

White('\t', exact=5) +
从grammar_line_short中,它可以找到续行,但也可以匹配标题中的一组内容:

...
['Part']
['Reference']
['1', '177347', '5', '100P', 'capc1608_is0603n', 'C1,C2,C3,C4,C5']
['2', '176054', '9', '1.0uF', 'capc3216_is1206n', 'C6,C23,C32,C88,C95,C98,']
['C99,C140,C141']...
我补充说:

+ White('\t', exact=1).suppress()
到grammer_line_full中的每个元素,它没有改变任何东西

最后,我将延续线部分引用和完整的行值连接起来,所以我认为需要单独解析它们。我的最终目标是解析所有的头信息(代码没有显示,有一个解析器)和所有的组件信息


我知道不喜欢使用空格,但这似乎是处理这种格式的最佳方法,只是它不适合我…

我怀疑MatchFirst表达式隐式跳过了续行开头的空格。尝试这样做(未经测试):

grammer_body = (grammer_line_full | grammer_line_short).leaveWhitespace()