在 PyParsing 中,如何将 Combine() 与非默认的 joinString 一起使用

In PyParsing, how to use Combine() with a non-default joinString

我正在尝试重构以下解析表达式中的 version_name

In [1]: from pyparsing import *

In [2]: version_code = "(" + Word(nums)("version_code") + ")"

In [3]: version_name = OneOrMore(~version_code + Word(printables)).setParseActio
   ...: n(lambda s,l,t: " ".join(t))("version_name")

In [4]: expression = version_name + version_code

In [5]: result = expression.parseString("1.0 beta (10)")

In [6]: result.asDict()
Out[6]: {'version_code': '10', 'version_name': '1.0 beta'}

我不想使用 .setParseAction(lambda s,l,t: " ".join(t)),而是想使用 Combine()。但是,如果我尝试将 version_name 替换为

In [7]: version_name = Combine(OneOrMore(~version_code + Word(printables)), join
   ...: String=" ")("version_name")

然后重新运行测试,

In [8]: expression = version_name + version_code

In [9]: result = expression.parseString("1.0 beta (10)")

我得到一个

ParseException: Expected "(" (at char 4), (line:1, col:5)

似乎解析器停止解析 1.0 之后的 version_name 而不是预期的 1.0 beta 之后。有没有办法用 Combine() 重构它,使其仍然有效?

根据 PaulMcG 的评论,我在 Combine() 的构造函数中添加了 adjacent=False

In [1]: from pyparsing import *

In [2]: version_code = "(" + Word(nums)("version_code") + ")"

In [3]: version_name = Combine(OneOrMore(~version_code + Word(printables)), joinString=" ", adjacent=False)("version_name")

In [4]: expression = version_name + version_code

In [5]: result = expression.parseString("1.0 beta (10)")

In [6]: result.asDict()
Out[6]: {'version_code': '10', 'version_name': '1.0 beta'}

version_name 现在包含所需的两个单词 ('1.0 beta')。