使用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
我确信有办法做到这一点,但我一直无法找到它。
提前致谢
答案 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
。