我有一个来自游戏的文件,我正在尝试解析它。以下是摘录:
<stage> id: 50 #Survival Stage
<phase> bound: 1500 # phase 0 bandit
music: bgm\stage4.wma
id: 122 x: 100 #milk ratio: 1
id: 30 hp: 50 times: 1
id: 30 hp: 50 times: 1 ratio: 0.7
id: 30 hp: 50 times: 1 ratio: 0.3
<phase_end>
<stage_end>
#
表示注释,但仅限于人类读者,而不是游戏的解析器。前两个注释位于行尾,但 #milk
之后的 ratio: 1
不是注释的一部分,它实际上很重要。我认为游戏的解析器会忽略任何它无法理解的标记。有没有办法在 pyparsing 中做到这一点?
我尝试使用parser.ignore(pp.Word(pp.printables))
,但这使它跳过所有内容。到目前为止,这是我的代码:
import pyparsing as pp
txt = """
<stage> id: 50 #Survival Stage
<phase> bound: 1500 # phase 0 bandit
music: bgm\stage4.wma
id: 122 x: 100 #milk ratio: 1
id: 30 hp: 50 times: 1
id: 30 hp: 50 times: 1 ratio: 0.7
id: 30 hp: 50 times: 1 ratio: 0.3
<phase_end>
<stage_end>
"""
phase = pp.Literal('<phase>')
stage = pp.Literal('<stage>') + pp.Literal('id:') + pp.Word(pp.nums)('id') + pp.OneOrMore(phase)
parser = stage
parser.ignore(pp.Word(pp.printables))
print(parser.parseString(txt).dump())
最佳答案
事实证明,在库存游戏文件中,只有 ratio:
关键字出现在 #
之后,因此我用它来定义注释的结尾,如下所示:
parser.ignore(Suppress('#') + SkipTo(MatchFirst([FollowedBy('ratio:'), LineEnd()])))
关于python - pyparsing:忽略任何不匹配的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291414/