Python 使用pyparsing匹配非空行

Python 使用pyparsing匹配非空行,python,pyparsing,Python,Pyparsing,我正在尝试制作一个小应用程序,它使用pyparsing从另一个程序生成的文件中提取数据 这些文件具有以下格式 SOME_KEYWORD: line 1 line 2 line 3 line 4 ANOTHER_KEYWORD: line a line b line c 如何构造有助于提取第1行,第2行的语法第4行和第a行第c行? 我想做一个这样的建筑 Grammar = Keyword("SOME_KEYWORD:").supress() + NonEmptyLines + EmptyLin

我正在尝试制作一个小应用程序,它使用
pyparsing
从另一个程序生成的文件中提取数据

这些文件具有以下格式

SOME_KEYWORD:
line 1
line 2
line 3
line 4

ANOTHER_KEYWORD:
line a
line b
line c
如何构造有助于提取
第1行
第2行
的语法<代码>第4行和
第a行
<代码>第c行? 我想做一个这样的建筑

Grammar = Keyword("SOME_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress() +\
         Keyword("ANOTHER_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress()
但是我不知道如何定义
nonemptyline
EmptyLine

谢谢

这将带您完成大部分工作:

import pyparsing as pp

data = """
SOME_KEYWORD:
line 1
line 2
line 3
line 4

ANOTHER_KEYWORD:
line a
line b
line c
"""

some_kw = pp.Keyword('SOME_KEYWORD:').suppress()
another_kw = pp.Keyword('ANOTHER_KEYWORD:').suppress()
kw = pp.Optional(some_kw ^ another_kw)

# Hint from: http://pyparsing.wikispaces.com/message/view/home/21931601
lines = kw + pp.SkipTo(
    pp.LineEnd() + pp.OneOrMore(pp.LineEnd()) |
    pp.LineEnd() + pp.StringEnd() |
    pp.StringEnd()
)

result = lines.searchString(data.strip())
results_list = result.asList()
# => [['\nline 1\nline 2\nline 3\nline 4'], ['\nline a\nline b\nline c']]
在构建语法时,为变量分配部分并在可能的情况下引用这些部分确实很有帮助。

我的看法:

    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
结果是:

['SOME_KEYWORD:', ['line 1', 'line 2', 'line 3', 'line 4'], 'ANOTHER_KEYWORD:', ['line a', 'line b', 'line c']]

+回答得好。这个应用程序非常面向行,因此定义LineEnd()表达式或多或少是不可避免的。通常在执行此操作时,您还希望在导入pyparsing后立即使用:
ParseRelation.setDefaultWhitespaceChars(“\t”)
,重新定义默认的空白字符集,使其不包含
\n
。然后,您就可以将
LineEnd()*(2,无)
检测为关键字组之间的分隔符。Pyparsing不再托管在wikispaces.com上。去