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

我有一个文件(从OrCAD提取的BOM文件),该文件具有标题,带有组件信息的行和用于零件引用的延续行:

(名为test_string_body,制表符在组成部分中用于分隔)

SCH, WACI  Revised: Wednesday, March 29, 2017
357403-01          Revision: A

Bill Of Materials          March 29,2017      17:53:04  Page1

Item    P/N Quantity    Value   PCB Footprint   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
3   177606  31  100P    capc1005_is0402n    C7,C8,C9,C10,C11,C12,C13,
    C14,C15,C16,C53,C56,C64,
    C69,C261,C262,C263,C268,


python - MatchFirst没有传递给第二ParseExpression吗?-LMLPHP

为了解析完整的行,我使用:

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


我得到了期望的结果(恰好合适的行):

for match, start, stop in grammer_body.parseWithTabs().scanString(test_string_body):
    print(match)


如果我设置:

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,']...


只是grammer_line_short:

['\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) +


从grammer_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()

关于python - MatchFirst没有传递给第二ParseExpression吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43839380/

10-12 17:00