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

2024-10-06 15:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想把它转换成相应的整数列表:

^{pr2}$

但是,我很难找到正确的函数来放入setParseAction方法来实现这个结果。以下是我迄今为止尝试过的方法(在python2中):

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]}

parse操作似乎只将第一个字符串转换为整数。如何修改它以获得所需的整数列表?或者更一般地说:给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']不一样?在


Tags: 字符串in列表string整数inttokensparsestring
1条回答
网友
1楼 · 发布于 2024-10-06 15:16:12

我认为pyparsing_common.convertToInteger解析操作可以做到这一点,它是使用pyparsing.tokenMap(int)实现的。在

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

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

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

或者,将解析操作移动到OneOrMore内:

^{pr2}$

相关问题 更多 >