2017-05-08 77 views
1

似乎第一個ParseExpression應該失敗時,MatchFirst似乎不會傳遞到下一個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, 

Visible whitespace

爲了解析這些全行我用:

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 or 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中的每個元素,它沒有改變任何東西。

我最終將連續線部分引用與完整行值連接起來,所以我想我需要分別解析它們。我的最終目標是解析所有標題信息(代碼未顯示,有解析器)和所有組件信息。

我知道有空格的工作不是首選,但它似乎處理這種不同之處在於它不爲我工作的格式的最好方式......

回答

1

我懷疑MatchFirst表達含蓄地跳過在延續線的開頭留有空白。嘗試做這件事(未經測試):

grammer_body = (grammer_line_full | grammer_line_short).leaveWhitespace() 
+0

謝謝,這工作,另外我的筆記:) – RunDeep

相關問題