是否可以给 pyparsing 一个解析列表并让它返回原始字符串?
问问题
1162 次
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 回答