2

是否可以给 pyparsing 一个解析列表并让它返回原始字符串?

4

1 回答 1

7

是的,如果您已指示解析器不要丢弃任何输入,则可以。你用Combine组合器来做。

假设您的输入是:

>>> s = 'abc,def,  ghi'

这是一个获取列表确切文本的解析器:

>>> from pyparsing import *
>>> myList = Word(alphas) + ZeroOrMore(',' + Optional(White()) + Word(alphas))
>>> myList.leaveWhitespace()
>>> myList.parseString(s)
(['abc', ',', 'def', ',', '  ', 'ghi'], {})

要“分解”:

>>> reconstitutedList = Combine(myList)
>>> reconstitutedList.parseString(s)
(['abc,def,  ghi'], {})

这会给你最初的输入。

但这是有代价的:将所有额外的空白作为标记浮动通常并不方便,您会注意到我们必须. myList这是一个去除空格的版本:

>>> myList = Word(alphas) + ZeroOrMore(',' + Word(alphas))
>>> myList.parseString(s)
(['abc', ',', 'def', ',', 'ghi'], {})
>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abc,def,ghi'], {})

请注意,此时您没有得到文字输入,但这对您来说可能已经足够了。另请注意,我们必须明确告诉 Combine 允许跳过空格。

但是,实际上,在许多情况下,您甚至都不关心分隔符。您希望解析器专注于项目本身。有一个名为的函数commaSeparatedList可以方便地为您去除分隔符和空格:

>>> myList = commaSeparatedList
>>> myList.parseString(s)
(['abc', 'def', 'ghi'], {})

但是,在这种情况下,“deparsing”步骤没有足够的信息让重构的字符串变得有意义:

>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})
于 2010-07-08T04:42:17.663 回答