MatchFirst 没有传递给第二个 ParseExpression?
MatchFirst not passing to second ParseExpression?
当第一个 ParseExpression 似乎应该失败时,MatchFirst 似乎没有传递给下一个 ParseExpression。
我有一个文件(从 OrCAD 中提取 BOM),其中包含 header、包含组件信息的行和零件参考的续行:
(命名为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,
为了解析我使用的完整行:
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,它找到了续行,但它也匹配了来自 header:
的一堆东西
...
['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 中的每个元素,它没有改变任何东西。
我最终将续行部分引用与整行值连接在一起,因此我认为我需要单独解析它们。我的最终目标是解析所有 header 信息(代码未显示,有一个解析器)和所有组件信息。
我知道使用空格不是首选,但它似乎是处理这种格式的最佳方式,只是它对我不起作用...
我怀疑 MatchFirst 表达式隐式跳过了连续行开头的空格。尝试这样做(未经测试):
grammer_body = (grammer_line_full | grammer_line_short).leaveWhitespace()
当第一个 ParseExpression 似乎应该失败时,MatchFirst 似乎没有传递给下一个 ParseExpression。
我有一个文件(从 OrCAD 中提取 BOM),其中包含 header、包含组件信息的行和零件参考的续行:
(命名为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,
为了解析我使用的完整行:
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,它找到了续行,但它也匹配了来自 header:
的一堆东西...
['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 中的每个元素,它没有改变任何东西。
我最终将续行部分引用与整行值连接在一起,因此我认为我需要单独解析它们。我的最终目标是解析所有 header 信息(代码未显示,有一个解析器)和所有组件信息。
我知道使用空格不是首选,但它似乎是处理这种格式的最佳方式,只是它对我不起作用...
我怀疑 MatchFirst 表达式隐式跳过了连续行开头的空格。尝试这样做(未经测试):
grammer_body = (grammer_line_full | grammer_line_short).leaveWhitespace()