在 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'
)。
我正在尝试重构以下解析表达式中的 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'
)。