我不知道如何解析纯文本(也有空格),并且仍然能够匹配文本中的特殊结构。假设你有一个像
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;我不确定这有什么问题...有什么建议吗?