2012-08-07 49 views
2

我已經定義了幾個pyparsing令牌如下:速記定義PyParsing字段名稱

field = Word(alphas + "_").setName("field") 

難道真的沒有速記本?

此外,這似乎並不奏效,由expression.parseString()返回的字典總是空的。

回答

2

你很困惑setNamesetResultsNamesetName爲表達式分配一個名稱,以便異常消息更有意義。比較:

>>> integer1 = Word(nums) 
>>> integer1.parseString('x') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python26\lib\site-packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py", line 1032, in parseString 
    raise exc 
pyparsing.ParseException: Expected W:(0123...) (at char 0), (line:1, col:1) 

和:

>>> integer2 = Word(nums).setName("integer") 
>>> integer2.parseString('x') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python26\lib\site-packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py", line 1032, in parseString 
    raise exc 
pyparsing.ParseException: Expected integer (at char 0), (line:1, col:1) 

setName起名來表達自己。

setResultsName另一方面給出了返回的解析數據的名稱,就像正則表達式中的命名字段一樣。

>>> expr = integer.setResultsName('age') + integer.setResultsName('credits') 
>>> data = expr.parseString('20 110') 
>>> print data.dump() 
['20', '110'] 
- age: 20 
- credits: 110 

正如@Kimvais已經提到的,setResultsName快捷方式:

>>> expr = integer('age') + integer('credits') 

還要注意setResultsName返回表達式的一個副本 - 這是使用相同的唯一途徑表達多次與不同的名字作品。

+0

謝謝。 - 想知道爲什麼默認的名稱不是_not_變量名稱... – Kimvais 2012-08-07 15:00:48

+3

一個常見的請求,但這是一個Python問題,而不是pyparsing。 'expr = Word(nums); number = expr'現在number和expr都指向同一個表達式。現在做'expr.parseString('123')'對象確實*不知道自己的名字是什麼,並且試圖通過'locals()'來查找會找出'expr'和'number'。 – PaulMcG 2012-08-07 15:13:38

1

field = Word(alphas + "_")("field")

似乎工作。