python - pyparsing:忽略任何不匹配的标记

标签 python pyparsing

我有一个来自游戏的文件,我正在尝试解析它。以下是摘录:

    <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/

相关文章:

python - Pyparsing简单算术语法不捕获表达式

python - 使用 pyparsing 对结果进行类型检查

python - pyparsing中Word的非贪婪匹配?

python - Pandas:包含元组的熔化列

python-2.7 - Python 3 的 Pyparsing

python - pyparsing - 加载 ABNF?

python - 如何使用 for 循环替换字符串中的多个字符?

Python 总结器 Sumy

python - "ImportError: No module named jobs.models"相对路径

python - 分钟和秒作为 Python 中的变量