Python &引用;“去纵火”;使用pyparsing的列表

Python &引用;“去纵火”;使用pyparsing的列表,python,parsing,pyparsing,Python,Parsing,Pyparsing,可以给pyparsing一个解析过的列表并让它返回原始字符串吗?是的,如果您已经指示解析器不要丢弃任何输入,您可以这样做。您可以使用Combinecombinator进行操作 假设您的输入是: >>> s = 'abc,def, ghi' 下面是一个解析器,它获取列表的确切文本: >>> from pyparsing import * >>> myList = Word(alphas) + ZeroOrMore(',' + Optiona

可以给pyparsing一个解析过的列表并让它返回原始字符串吗?

是的,如果您已经指示解析器不要丢弃任何输入,您可以这样做。您可以使用
Combine
combinator进行操作

假设您的输入是:

>>> s = 'abc,def,  ghi'
下面是一个解析器,它获取列表的确切文本:

>>> from pyparsing import *
>>> myList = Word(alphas) + ZeroOrMore(',' + Optional(White()) + Word(alphas))
>>> myList.leaveWhitespace()
>>> myList.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'], {})
但是,在这种情况下,“去parsing”步骤没有足够的信息使重构的字符串有意义:

>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})

可能-你能把你的问题编辑成一个“之前”和“之后”的例子吗?这可能是一个相关的讨论线程(),讨论pyparsing的“双向”功能。我得说,对于这样一个模糊的问题,你真的选择了这一个并运行了。爱死它了!非常好的回答,感谢您参与pyparsing的主题!还可以查看最近添加的
originalTextFor
helper方法,以获得您描述的一些类似功能,但它甚至可以保留中间的空白。很酷的提示,Paul!我一直在寻找这样的东西,但没有找到,因为1)pyparsing页面上的API文档链接已断开,2)我找到的UCSC在线文档可能已经过时。希望我们能得到一个或另一个更新!我来看看最新的源代码+文档。
>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})