>>> test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14,"
這裏是你的輸入字符串pyparsing處理器:
>>> from pyparsing import *
>>> integer = Word(nums)
>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(',')))
使用patt.parseString返回pyparsing ParseResults對象,其中有一些很好的列表/字典/對象屬性。首先,將結果打印成列表:
>>> patt.parseString(test).asList()
['somestring', ['363', '1', '46', '17'], ['363', '1', '34', '17'], ['401', '3', '8', '14']]
查看您的每個組是如何分組的子列表?
現在讓我們讓解析器爲我們做更多的工作。在解析時,我們已經知道我們正在解析有效整數 - 任何匹配Word(nums)
的東西都必須是整數。因此,我們可以添加一個解析動作做在分析時這種轉換:
>>> integer = Word(nums).setParseAction(lambda tokens:int(tokens[0]))
現在,我們重新調整我們的模式,現在解析爲我們提供了一組數字:
>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(',')))
>>> patt.parseString(test).asList()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
最後,我們還可以指定名稱解析出該輸入的比特:
>>> patt = Word(alphas)("desc") + OneOrMore(Group(integer*4 + Suppress(',')))("numgroups")
返回的項目列表是相同的:
>>> patt.parseString(test).asList()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
但是如果我們轉儲()的結果,我們看看我們可以按名稱訪問:
>>> print patt.parseString(test).dump()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
- desc: somestring
- numgroups: [[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
我們可以使用類似字典的或屬性,如訪問那些名字。我偏愛的屬性風格自己:
>>> res = patt.parseString(test)
>>> print res.desc
somestring
>>> print res.numgroups
[[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
>>> for ng in res.numgroups: print sum(ng)
...
427
415
426
這裏是整個解析器和輸出處理器:
test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14,"
from pyparsing import *
integer = Word(nums).setParseAction(lambda tokens:int(tokens[0]))
patt = Word(alphas)("desc") + \
OneOrMore(Group(integer*4 + Suppress(',')))("numgroups")
print patt.parseString(test).asList()
print patt.parseString(test).dump()
res = patt.parseString(test)
print res.desc
print res.numgroups
for ng in res.numgroups:
print sum(ng)
這就要困難得多,因爲逗號既用作整數的分隔符和「數據單位」。如果您可以輕鬆影響數據的外觀,那麼我會嘗試在每個字符串之前使用分號。使用'split'應該足夠了,而不是re。 – 2010-03-03 08:45:32