使用pyparsing"删除"列表

adi*_*nsa 2 python parsing pyparsing

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

Owe*_* S. 6

是的,如果你已经指示解析器不丢弃任何输入,你可以.你用Combine组合器做到了.

假设您的输入是:

>>> s = 'abc,def,  ghi'
Run Code Online (Sandbox Code Playgroud)

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

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

要"解体":

>>> reconstitutedList = Combine(myList)
>>> reconstitutedList.parseString(s)
(['abc,def,  ghi'], {})
Run Code Online (Sandbox Code Playgroud)

它会为您提供初始输入.

但这是有代价的:具有所有这些额外的空格左右浮动作为标记通常是不方便,你会注意到,我们必须明确地把空白跳过myList.这是一个剥离空格的版本:

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

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

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

>>> myList = commaSeparatedList
>>> myList.parseString(s)
(['abc', 'def', 'ghi'], {})
Run Code Online (Sandbox Code Playgroud)

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

>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})
Run Code Online (Sandbox Code Playgroud)