是否可以为解析列表提供pyparsing并让它返回原始字符串?
答案 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'], {})