PyParsing 前瞻和贪婪表达式

2024-01-05

我正在使用 PyParsing 为查询语言编写解析器,并且我陷入了(我认为是)前瞻问题。查询中的一种子句类型旨在将字符串拆分为 3 个部分(字段名、运算符、值),其中字段名是一个单词,运算符是一个或多个单词,值是一个单词、带引号的字符串或带括号的列表这些。

我的数据看起来像

author is william
author is 'william shakespeare'
author is not shakespeare
author is in (william,'the bard',shakespeare)

我当前对该子句的解析器写为:

fieldname = Word(alphas)

operator = OneOrMore(Word(alphas))

single_value = Word(alphas) ^ QuotedString(quoteChar="'")
list_value = Literal("(") + Group(delimitedList(single_value)) + Literal(")")
value = single_value ^ list_value

clause = fieldname + originalTextFor(operator) + value

显然这失败了,因为operator元素是贪婪的并且会吞噬value如果可以的话。通过阅读其他类似的问题和文档,我发现我需要使用NotAny or FollowedBy,但我一直无法弄清楚如何使其发挥作用。


这是成为解析器的好地方。或者更准确地说,让解析器像你一样思考。问问自己,“在‘作者是莎士比亚’中,我怎么知道‘莎士比亚’不是运算符的一部分?”您知道“shakespeare”是值,因为它位于查询的末尾,后面没有其他内容。所以运算符词不仅仅是字母词,它们是字母单词,后面没有字符串结尾。现在将先行逻辑构建到您的定义中operator:

operator = OneOrMore(Word(alphas) + ~FollowedBy(StringEnd()))

我认为这将为您提供更好的解析。

其他一些提示:

  • 我仅在可能存在歧义的情况下使用“^”运算符,例如我要解析带有整数或十六进制数字的字符串。如果我用过Word(nums) | Word(hexnums),那么我可能会将“123ABC”误处理为前导“123”。通过改变“|”对于“^”,将测试所有替代方案,并选择最长的匹配。在我解析十进制或十六进制整数的示例中,我可以通过反转替代方案并测试来获得相同的结果Word(hexnums)第一的。在您的查询语言中,无法将带引号的字符串与不带引号的单个单词值混淆(一个以' or ",另一个没有),所以没有理由使用'^','|'就足够了。类似的value = singleValue ^ listValue.

  • 将结果名称添加到查询字符串的关键组成部分将使以后更容易使用:

    clause = fieldname("fieldname") + originalTextFor(operator)("operator") + value("value")

    现在,您可以通过名称而不是通过解析位置访问解析的值(一旦您开始使用可选字段等变得更加复杂,这将变得棘手且容易出错):

    queryParts = clause.parseString('author is william')

    print queryParts.fieldname

    print queryParts.operator

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyParsing 前瞻和贪婪表达式 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代

随机推荐

  • bash 合并文件中的行

    我想转换这个文本 qa ops01 mysite com dev mapper sys home 58G 26G 30G 47 home dev mapper sys tmp 3 9G 2 3G 1 5G 61 tmp qa ops02 m
  • 替代关系已弃用警告

    密码查询 MATCH x WHERE x uuid 41f64ab1 6009 4e95 b22b c833525f6edb MATCH p o CONTAINS HAVING gt x WHERE labels o IN Box Pack
  • 使用 Brunch 控制脚本串联的顺序

    使用 Brunch 时控制脚本 样式表连接顺序的最佳实践是什么 我的问题的一个简单版本涉及使用 Twitter Bootstrap 的应用程序 这需要 jQuery Bootstrap 要求首先加载 jQuery 最初我的供应商 目录中有以
  • 查看单个文件时,Xcode 快速帮助显示“无快速帮助”

    当我打开 Xcode 项目时 快速帮助功能工作得很好 但是当打开文件时 例如abc swift 不在打开的项目中 则不会出现文档 这是一个例子 安装该版本Command Line Tools为你的 Xcode Xcode menu gt O
  • 尝试序列化实体框架对象时出现 XML 序列化错误

    我有通过实体框架获取的实体 我使用的是 Code First 所以它们是 POCO 当我尝试使用 XmlSerializer 对它们进行 XML 序列化时 出现以下错误 方式 System Data Entity DynamicProxie
  • MySql select IN 子句字符串逗号分隔

    我需要按以下方式执行选择查询 select from my table where id NOT IN comma delimited string 实现这一目标的正确方法是什么 考虑到我控制发送字符串的客户端代码 是否有更好的方法 该字符
  • 根据R中的另一列删除重复日期

    我有一个时间序列 其中包含几个小时的多个条目 date wd ws temp sol octa pg mh daterep 1 2007 01 01 00 00 00 100 1 5 9 0 0 8 D 100 FALSE 2 2007 0
  • Magento:何时将变量传递给块,何时不传递?

    我最近发现使用分配方法在 toHtml 方法中将变量设置到块的强大功能 我的问题是 什么时候适合这样做 什么时候不适合 我正在创建一个新模块 在我看来 将所有变量分配给块并在视图文件中引用这些变量而不是设置类似的东西是非常好的 div di
  • 使用 Anaconda 安装 Pygame

    我正在尝试在 Mac 上安装 pygame 并遇到大量错误 我不能百分百确定这告诉了我什么 但它告诉了我很多 是不是说Pygame只兼容Python 3 5 因为 StackOverflow 上还有另一张票 在 Mac 上使用 anacon
  • 使用 gtag.js 获取客户端 ID

    谷歌发布gtag js https developers google com analytics devguides collection gtagjs 几个月前 作为 Google Analytics 跟踪的新方式 据我了解 最终取代了
  • Perl方法调用可以被拦截吗?

    你能在 Perl 中拦截一个方法调用 对参数做一些事情 然后执行它吗 是的 您可以拦截 Perl 子例程调用 我有一整章关于这类事情掌握 Perl http www masteringperl org 查看钩子 LexWrap http s
  • 如何将map转换为Spark的RDD

    我有一个数据集 它是一些嵌套映射的形式 它的 Scala 类型是 Map String LabelType Map Int Double 首先Stringkey 是每个样本的唯一标识符 value 是一个包含标签 为 1 或 1 的元组 以
  • Haxl 和 Stitch 中的并发数据访问

    这是我之前的后续question https stackoverflow com questions 27591599 are futures in scala really functional 据我了解Haxl http www cs
  • 如何将 Pillow EPS 调整为 JPG 质量

    我正在尝试使用 Pillow 将 EPS 图像转换为 JPEG 但结果质量较低 我正在尝试使用resize方法 但它被完全忽略了 我将 JPEG 图像的大小设置为 3600 4700 但结果图像有 360 470 尺寸 我的代码是 eps
  • Rails 对现有的 ActiveRecord 结果数组进行分页

    我通常在应用程序中使用 will paginate 进行分页 但我的搜索功能遇到了问题 我正在使用 Thinking Sphinx 进行全文搜索 它返回分页的结果 我遇到的问题是 在收到 Thinking Sphinx 的结果后 我需要将它
  • 使用带有子进程、Pipe、Popen 的 python 从 hdfs 读取/写入文件会出现错误

    我正在尝试在 python 脚本内读取 打开 和写入 hdfs 中的文件 但有错误 有人可以告诉我这里出了什么问题吗 代码 完整 sample py usr bin python from subprocess import Popen P
  • 我可以让堆太大吗?

    我明白 一个更大的堆意味着更长的 GC 暂停时间 https stackoverflow com questions 1651225 how to choose the jvm heap size 我对此表示同意 我的代码正在分析一些数据
  • 在c中将128分配给char变量

    输出是 128 的 32 位 2 的补码 即 4294967168 怎么样 include
  • 在 Spark Web UI 中无法看到已完成的作业

    我在用 bin spark submit运行我的 Spark 作业 它运行良好 但打开 Spark Web UI 我在已完成列表中看不到作业 bin spark submit name myapp master local conf spa
  • PyParsing 前瞻和贪婪表达式

    我正在使用 PyParsing 为查询语言编写解析器 并且我陷入了 我认为是 前瞻问题 查询中的一种子句类型旨在将字符串拆分为 3 个部分 字段名 运算符 值 其中字段名是一个单词 运算符是一个或多个单词 值是一个单词 带引号的字符串或带括