python – 运算符的Pyparsing问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 运算符的Pyparsing问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1479字,纯文字阅读大概需要3分钟。
内容图文
我做了一个带有pyparsing的语法,我有一个问题.
语法试图解析搜索查询(使用运算符优先级,括号等),我需要空格像和运算符一样工作.
例如,这工作正常:
(word and word) or word
但这失败了:
(word word) or word
我希望第二个查询像第一个查询一样工作.
我的实际语法是:
WWORD = printables.replace("(", "").replace(")", "")
QUOTED = quotedString.setParseAction(removeQuotes)
OAND = CaselessLiteral("and")
OOR = CaselessLiteral("or")
ONOT = "-"
TERM = (QUOTED | WWORD)
EXPRESSION = operatorPrecedence(TERM,
[
(ONOT, 1, opAssoc.RIGHT),
(OAND, 2, opAssoc.LEFT),
(OOR, 2, opAssoc.LEFT)
])
STRING = OneOrMore(EXPRESSION) + StringEnd()
解决方法:
解决问题的一种方法是将AND定义为Optional运算符.如果你这样做,你必须格外小心,真正的关键词如“和”和“或”不会被误解为搜索词.此外,使用Optional,您可以添加默认字符串,这样即使原始搜索查询中缺少“和”,您的解析文本也会为您插入(以便于解析后处理).
from pyparsing import *
QUOTED = quotedString.setParseAction(removeQuotes)
OAND = CaselessLiteral("and")
OOR = CaselessLiteral("or")
ONOT = Literal("-")
WWORD = ~OAND + ~OOR + ~ONOT + Word(printables.replace("(", "").replace(")", ""))
TERM = (QUOTED | WWORD)
EXPRESSION = operatorPrecedence(TERM,
[
(ONOT, 1, opAssoc.RIGHT),
(Optional(OAND,default="and"), 2, opAssoc.LEFT),
(OOR, 2, opAssoc.LEFT)
])
STRING = OneOrMore(EXPRESSION) + StringEnd()
tests = """word and ward or wird
word werd or wurd""".splitlines()
for t in tests:
print STRING.parseString(t)
得到:
[[['word', 'and', 'ward'], 'or', 'wird']]
[[['word', 'and', 'werd'], 'or', 'wurd']]
内容总结
以上是互联网集市为您收集整理的python – 运算符的Pyparsing问题全部内容,希望文章能够帮你解决python – 运算符的Pyparsing问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。