是的,如果你已经指示解析器不丢弃任何输入,你可以.你用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)