解析特殊字符旁边的关键字(pyparsing)

时间:2016-08-09 18:59:52

标签: python python-2.7 parsing text-parsing pyparsing

使用pyparsing,如何在特殊字符之前或之后(如“{”或“}”)匹配关键字?下面的代码显示我的关键字“msg”不匹配,除非前面有空格(或者在开头):

import pyparsing as pp

openBrace = pp.Suppress(pp.Keyword("{"))
closeBrace = pp.Suppress(pp.Keyword("}"))
messageKw = pp.Keyword("msg")
messageExpr = pp.Forward()
messageExpr << messageKw + openBrace +\
                pp.ZeroOrMore(messageExpr) + closeBrace

try:
    result = messageExpr.parseString("msg { msg { } }")
    print result.dump(), "\n"
    result = messageExpr.parseString("msg {msg { } }")
    print result.dump()
except pp.ParseException as pe:
    print pe, "\n", "Text: ", pe.line

我确信有办法做到这一点,但我一直无法找到它。

提前致谢

1 个答案:

答案 0 :(得分:1)

openBrace = pp.Suppress(pp.Keyword("{"))
closeBrace = pp.Suppress(pp.Keyword("}"))

应该是:

openBrace = pp.Suppress(pp.Literal("{"))
closeBrace = pp.Suppress(pp.Literal("}"))

甚至只是:

openBrace = pp.Suppress("{")
closeBrace = pp.Suppress("}")

(大多数pyparsing类会自动将字符串参数"arg"提升为Literal("arg")。)

当我有多个标点符号的解析器时,我不会像这样大胆地说出一大堆丑闻,我会把它们折叠成类似的东西:

OBRACE, CBRACE, OPAR, CPAR, SEMI, COMMA = map(pp.Suppress, "{}();,")

你看到的问题是Keyword查看周围的字符,以确保当它真正嵌入更大的类似标识符的字符串时,不会意外匹配当前字符串。在Keyword('{')中,只有在没有相邻字符可能被混淆为较大单词的一部分时才会起作用。因为&#39; {&#39;本身并不是一个典型的关键字字符,使用Keyword('{')并不能很好地利用该类。

仅对可能被误解为标识符的字符串使用Keyword。要匹配不在典型关键字字符集中的字符(通过&#34;关键字字符&#34;我的意思是字母数字+&#39; _&#39;),请使用Literal