我試圖解析類似於XML文件(沒有關聯DTD)與pyparsing與可選的,每一個奇怪的問題,並排序:可選元素的列表。每個記錄部分看起來有以下內容:Pyparsing:解析器元素
- 內
<L>
和<L/>
標籤的東西, 內
- 一個或更多的東西,
- 可選,內
<MW>
和<MW/>
標籤的東西, - 可選地,文字
<mul/>
和可選的文字<mat/>
<pc>
和
<pc/>
標籤
這些元素的排序有所不同。
所以我寫了下面的(我是新來的pyparsing,請指出,如果我做一些愚蠢的事):
#!/usr/bin/env python
from pyparsing import *
def DumbTagParser(tag):
tag_close = '</%s>' % tag
return Group(
Literal('<') + Literal(tag).setResultsName('tag') + Literal('>')
+ SkipTo(tag_close).setResultsName('contents')
+ Literal(tag_close)
).setResultsName(tag)
record1 = Group(ZeroOrMore(DumbTagParser('pc'))).setResultsName('pcs') &\
DumbTagParser('L') & \
Optional(Literal('<mul/>')) & \
Optional(DumbTagParser('MW')) & \
Optional(Literal('<mat/>'))
record2 = Group(ZeroOrMore(DumbTagParser('pc'))).setResultsName('pcs') &\
Optional(DumbTagParser('MW')) & \
Optional(Literal('<mul/>')) & \
DumbTagParser('L')
def attempt(s):
print 'Attempting:', s
match = record1.parseString(s, parseAll = True)
print 'Match: ', match
print
attempt('<L>1.1</L>')
attempt('<pc>Page1,1</pc> <pc>Page1,2</pc> <MW>000001</MW> <L>1.1</L>')
attempt('<mul/><MW>000003</MW><pc>1,1</pc><L>3.1</L>')
attempt('<mul/> <MW>000003</MW> <pc>1,1</pc> <L>3.1</L> ') # Note end space
兩個解析器record1
和record2
失敗,與不同的異常。隨着record1
,它失敗的最後一個字符串(從倒數第二個字符串僅在空間不同):
pyparsing.ParseException: (at char 47), (line:1, col:48)
與record2
,它的倒數第二個字符串本身失敗:
pyparsing.ParseException: Missing one or more required elements (Group:({"<" "L" ">" SkipTo:("</L>") "</L>"})) (at char 0), (line:1, col:1)
現在是什麼奇怪的是,如果我在record2
的定義中互換第2行和第3行,那麼它解析得很好!
record2 = Group(ZeroOrMore(DumbTagParser('pc'))).setResultsName('pcs') &\
Optional(Literal('<mul/>')) & \
Optional(DumbTagParser('MW')) & \
DumbTagParser('L') # parses my example strings fine
(是的,我知道,record2
不包含任何規則<mat/>
。我試圖得到反映到重新排序這種敏感性最小的例子。)
我不知道,如果這是pyparsing或我的代碼中的錯誤,但我真正的問題是我應該如何解析我想要的字符串類型。
爲什麼downvote?我努力想出一個很好的問題,並將我的代碼分解爲一個簡單的例子,以及所有內容。 :-) – ShreevatsaR