匹配非空行与pyparsing

Ali*_*lik 4 python pyparsing

我正在尝试创建一个小应用程序,用于pyparsing从另一个程序生成的文件中提取数据.

这些文件具有以下格式.

SOME_KEYWORD:
line 1
line 2
line 3
line 4

ANOTHER_KEYWORD:
line a
line b
line c
Run Code Online (Sandbox Code Playgroud)

我怎样才能构建有助于提取的语法line 1,line 2... line 4line a.. line c?我正在尝试制作这样的结构

Grammar = Keyword("SOME_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress() +\
         Keyword("ANOTHER_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress()
Run Code Online (Sandbox Code Playgroud)

但我不知道如何定义NonEmptyLinesEmptyLine.谢谢.

Hen*_*nry 7

我接受它:

    from pyparsing import *

    # matches and removes end of line
    EOL = LineEnd().suppress()

    # line starts, anything follows until EOL, fails on blank lines,
    line = LineStart() + SkipTo(LineEnd(), failOn=LineStart()+LineEnd()) + EOL

    lines = OneOrMore(line)

    # Group keyword probably helps grouping these items together, you can remove it
    parser = Keyword("SOME_KEYWORD:") + EOL + Group(lines) + Keyword("ANOTHER_KEYWORD:") + EOL + Group(lines)
    result = parser.parseFile('data.txt')
    print result
Run Code Online (Sandbox Code Playgroud)

结果是:

['SOME_KEYWORD:', ['line 1', 'line 2', 'line 3', 'line 4'], 'ANOTHER_KEYWORD:', ['line a', 'line b', 'line c']]
Run Code Online (Sandbox Code Playgroud)

  • +1,很好的答案.这个应用程序非常面向行,因此定义LineEnd()表达式或多或少是不可避免的.通常在执行此操作时,您还希望在导入pyparsing后立即使用:'ParserElement.setDefaultWhitespaceChars("\ t")`重新定义默认的空白字符集以不包含`\n`.然后你就可以检测到`LineEnd()*(2,None)`作为关键字组之间的分隔符. (5认同)