将纯文本与pyparsing匹配

时间:2017-08-09 13:27:35

标签: python pyparsing

我不知道如何解析纯文本(也有空格),并且仍然能够匹配文本中的特殊结构。假设你有一个像

some plain text
specialStructure
plain text again
这样的字符串

我想要实现的是一个解析器,它给了我

['some plain text\n', 'specialStructure', '\nplain text again']

我的第一次尝试是

import pyparsing as pp

def join_words(toks):
    return ' '.join(toks)

struct = pp.Regex(r'specialStructure')
word = ~struct + pp.Word(pp.alphas)
txt = pp.OneOrMore(word).addParseAction(join_words)
grammar = pp.ZeroOrMore(struct | txt)

result = grammar.parseString(s)

即使这给了我在这种情况下我想要的东西,这里的问题是如果纯文本有一些换行符或制表符或其他类型的空格,最后我得到只有空格键分隔的单词...

如何找到原始文本,直到找到特殊结构或输入结尾?

更新

我发现的部分解决方案是使用SkipTo类:

import pyparsing as pp

struct = pp.Regex(r'specialStructure')
txt = pp.SkipTo( struct ) | pp.SkipTo( pp.StringEnd(), include=True )
grammar = pp.ZeroOrMore( struct | txt )

result = grammar.parseString(s)

这里的问题是嵌套结构。假设你有一个更复杂的字符串要解析,如:

s = """
some plain text
nestedStructureBegin
   here we are inside a nested structure
   nestedStructureBegin
      bla bla
   nestedStructureEnd
nestedStructureEnd
some bla bla again.
"""

import pyparsing as pp

grammar = pp.Forward()
begin = pp.Regex(r'nestedStructureBegin').suppress()
end = pp.Regex(r'nestedStructureEnd').suppress()
struct = begin + pp.Group(grammar) + end
keyword = begin | end
txt = pp.SkipTo( keyword ) | pp.SkipTo( pp.StringEnd(), include=True )
grammar << pp.ZeroOrMore( struct | txt )

for parser in [struct, txt]:
    parser.addParseAction(lambda toks: print(toks))

result = grammar.parseString(s)

我认为问题来自使用在嵌套结构中不匹配的pp.StringEnd,但我和#39;我不确定这有什么问题...有什么建议吗?

0 个答案:

没有答案