【问题标题】:Splitting text into lines with pyparsing使用 pyparsing 将文本拆分为行
【发布时间】:2015-07-22 13:12:17
【问题描述】:

我正在编写我的第一个使用 pyparsing 的程序。

我想解析一个文件,其中以“\n”结尾的每一行都是一个标记。

请解释一下怎么做。

实际上,我需要解析 .lyx 文件。 .lyx 文件的一个示例:https://github.com/nicowilliams/lyx/blob/master/lib/examples/Braille.lyx

【问题讨论】:

  • 请求的输出是什么?
  • @omri_saadon:在第一阶段,我只想将文件分成几行。 (标记是字符串。)之后(技巧!)我将使用 another 解析器解析每个标记。也就是我会先拆分成token,然后解析每个token。
  • 主解析器使用那个(“另一个”)解析器来确定有趣的标记序列。 “另一个”解析器仅用于检查标记的属性,其余工作由主解析器完成
  • 如果你的步骤真的很独立,那么我建议只使用 splitlines() 逐行分解初始字符串,然后将每个字符串传递给解析器,例如for line in input_string.splitlines(): result = line_parser.parseString(line) 你甚至可以使用sum 像这样将所有结果合并到一个结构中(注意在行解析器周围使用 Group 来单独维护每行的数据):all_results = sum(Group(line_parser).parseString(line) for line in input_string.splitlines())

标签: python parsing pyparsing lyx


【解决方案1】:

似乎以下解决了任务:

导入系统
导入 pyparsing # 欧芹

all_files = sys.argv[1:]

如果不是 all_files:
    打印“用法:DuplicateRefs.py FILE.lyx ...\n”
    系统退出(1)

def mylambda(tok):
    打印tok

parser = pyparsing.ZeroOrMore(pyparsing.CharsNotIn("\n").setParseAction(mylambda) + pyparsing.White("\n"))

对于 all_files 中的文件:
    parser.parseFile(file)

【讨论】:

  • 绝对按照 OP 的要求做 - 代替 White("\n"),尝试 LineEnd(),我从不喜欢解析器显式解析空格并尽可能避免它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多