使用pyparsing“删除”列表

时间:2010-07-06 17:39:55

标签: python parsing pyparsing

是否可以为解析列表提供pyparsing并让它返回原始字符串?

1 个答案:

答案 0 :(得分:6)

是的,你可以如果你已经指示解析器不要丢弃任何输入。您可以使用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'], {})

给你初回输入。

但是这需要付出代价:将所有额外的空格作为代币浮动,通常不方便,你会注意到我们必须在{{1}中明确地转换空格 off }。这是一个剥离空格的版本:

myList

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

但实际上,在许多情况下,你甚至不关心分隔符;您希望解析器专注于项目本身。有一个名为>>> myList = Word(alphas) + ZeroOrMore(',' + Word(alphas)) >>> myList.parseString(s) (['abc', ',', 'def', ',', 'ghi'], {}) >>> reconstitutedList = Combine(myList, adjacent=False) >>> reconstitutedList.parseString(s) (['abc,def,ghi'], {}) 的函数可以方便地为您分隔分隔符和空格:

commaSeparatedList

在这种情况下,“脱离”步骤没有足够的信息让重构的字符串有意义:

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