在PyParsing中,如何定义setParseAction函数以将字符串列表转换为整数列表?

时间:2017-05-25 15:01:50

标签: python pyparsing

我得到一个ParseResult,这是一个代表数字的字符串列表,例如,

['160', '240', '320', '480', '640']

我希望将其转换为相应的整数列表:

[160, 240, 320, 480, 640]

但是,我无法确定正确的函数以放入setParseAction方法来实现此结果。这是我到目前为止所尝试的内容(在Python 2中):

In [1]: from pyparsing import *

In [2]: string = "densities: '160' '240' '320' '480' '640'"

In [3]: densities = LineStart() + "densities:" + OneOrMore(QuotedString(quoteChar="'"))("densities").setParseAction(lambda tokens: map(int, tokens))

In [4]: tokens = densities.parseString(string)

In [5]: tokens.asDict()
Out[5]: {'densities': [160]}

解析操作似乎只将第一个字符串转换为整数。如何修改它以获得所需的整数列表?或者更一般地说:tokens中赋予setParseAction函数的.setParseAction(tokenMap(int))究竟代表什么?

更新

关注Paul McGuire的评论和回答,我已尝试使用densities,但结果命名结果[160]仍然只有In [1]: from pyparsing import * In [2]: string = "densities: '160' '240' '320' '480' '640'" In [3]: densities = LineStart() + "densities:" + OneOrMore(QuotedString(quoteCha ...: r="'"))("densities").setParseAction(tokenMap(int)) In [4]: tokens = densities.parseString(string) In [5]: tokens.asDict() Out[5]: {'densities': [160]}

traceParseAction

我还尝试使用In [6]: densities = LineStart() + "densities:" + OneOrMore(QuotedString(quoteChar="'"))("densities").setParseAction(traceParseAction(tokenMap(int))) In [7]: tokens = densities.parseString(string) >>entering int(line: 'densities: '160' '240' '320' '480' '640'', 11, (['160', '240', '320', '480', '640'], {'densities': [(['160', '240', '320', '480', '640'], {})]})) <<leaving int (ret: [160, 240, 320, 480, 640])

更深入地了解流程
ret

此处显示的tokens.asDict()['densities']是所需的结果,但不知何故它似乎与function saveSnapshot() { header("Content-Type: application/JSON: charset=UTF-8"); global $CFG; $resString = "{\"Success\": \"True\"}"; $snapshotName = getArgument("snapshotName"); $user = getArgument("userId"); $ttd = getArgument("ttData"); $fed = getArgument("feData"); $ttData = json_decode($ttd, true); $feData = json_decode($fed, true); 相同?

1 个答案:

答案 0 :(得分:2)

我认为pyparsing_common.convertToInteger解析操作可以解决问题,使用pyparsing.tokenMap(int)实现。

pyparsing.tokenMap将生成解析操作,该操作采用将对单个令牌进行操作的函数,并将其应用于所有已解析的令牌。有关tokenMap的更多信息:https://pythonhosted.org/pyparsing/pyparsing-module.html#tokenMap

编辑: 似乎还需要Group来实现这一点:

densities = (LineStart()
             + "densities:"
             + Group(OneOrMore(QuotedString(quoteChar="'")).setParseAction(tokenMap(int)))("densities")
             )

或者,将解析操作移到OneOrMore

densities = (LineStart()
             + "densities:"
             + OneOrMore(QuotedString(quoteChar="'").setParseAction(tokenMap(int)))("densities")
             )
相关问题