使用pyparsing匹配非空行
我正在尝试制作一个小应用程序,使用 pyparsing
来从另一个程序生成的文件中提取数据。
这些文件的格式如下。
SOME_KEYWORD:
line 1
line 2
line 3
line 4
ANOTHER_KEYWORD:
line a
line b
line c
我该如何构建语法,以帮助提取 line 1
、line 2
... line 4
以及 line a
.. line c
呢?我想做一个这样的结构
Grammar = Keyword("SOME_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress() +\
Keyword("ANOTHER_KEYWORD:").supress() + NonEmptyLines + EmptyLine.supress()
但是我不知道如何定义 NonEmptyLines
和 EmptyLine
。谢谢。
2 个回答
3
这段代码可以帮你解决大部分问题:
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']]
在构建语法的时候,把不同的部分分配给变量,并在需要的时候引用这些变量,会非常有帮助。
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
结果是:
['SOME_KEYWORD:', ['line 1', 'line 2', 'line 3', 'line 4'], 'ANOTHER_KEYWORD:', ['line a', 'line b', 'line c']]