在 PyParsing 中,如何定义一个 setParseAction 函数来将字符串列表转换为整数列表?
In PyParsing, how to define a setParseAction function to convert a list of strings to a list of integers?
我得到一个 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]}
解析操作似乎只将第一个字符串转换为整数。我如何修改它以获得所需的整数列表?或者更笼统地说:setParseAction
中函数的 tokens
到底代表什么?
更新
下面,Paul McGuire的评论和回答,我试过使用.setParseAction(tokenMap(int))
,但是得到的命名结果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']
?
不一样
我认为 pyparsing_common.convertToInteger
解析操作可以解决问题,它是使用 pyparsing.tokenMap(int)
实现的。
pyparsing.tokenMap
将生成解析操作,该操作采用将对单个标记进行操作的函数,并将其应用于所有已解析的标记。有关 tokenMap
的更多信息,请点击此处:https://pythonhosted.org/pyparsing/pyparsing-module.html#tokenMap
编辑:
似乎还需要 Group
ing 才能使其正常工作:
densities = (LineStart()
+ "densities:"
+ Group(OneOrMore(QuotedString(quoteChar="'")).setParseAction(tokenMap(int)))("densities")
)
或者,将解析操作移到 OneOrMore
:
densities = (LineStart()
+ "densities:"
+ OneOrMore(QuotedString(quoteChar="'").setParseAction(tokenMap(int)))("densities")
)
我得到一个 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]}
解析操作似乎只将第一个字符串转换为整数。我如何修改它以获得所需的整数列表?或者更笼统地说:setParseAction
中函数的 tokens
到底代表什么?
更新
下面,Paul McGuire的评论和回答,我试过使用.setParseAction(tokenMap(int))
,但是得到的命名结果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']
?
我认为 pyparsing_common.convertToInteger
解析操作可以解决问题,它是使用 pyparsing.tokenMap(int)
实现的。
pyparsing.tokenMap
将生成解析操作,该操作采用将对单个标记进行操作的函数,并将其应用于所有已解析的标记。有关 tokenMap
的更多信息,请点击此处:https://pythonhosted.org/pyparsing/pyparsing-module.html#tokenMap
编辑:
似乎还需要 Group
ing 才能使其正常工作:
densities = (LineStart()
+ "densities:"
+ Group(OneOrMore(QuotedString(quoteChar="'")).setParseAction(tokenMap(int)))("densities")
)
或者,将解析操作移到 OneOrMore
:
densities = (LineStart()
+ "densities:"
+ OneOrMore(QuotedString(quoteChar="'").setParseAction(tokenMap(int)))("densities")
)