区分 pyparsing 中的匹配

2024-01-02

我想用 pyparsing 解析一些单词和一些数字。简单就对了。

from pyparsing import *

A = Word(nums).setResultsName('A')
B = Word(alphas).setResultsName('B')
expr = OneOrMore(A | B)

result = expr.parseString("123 abc 456 7 d")
print result

上面的代码打印['123', 'abc', '456', '7', 'd']。所以一切都有效。现在我想对这些解析值进行一些处理。对于这个任务,我需要知道它们是否匹配A or B。有没有办法区分这两者。

经过一番研究后我发现的唯一一件事是items的方法ParseResults班级。但它只返回[('A', '7'), ('B', 'd')],只有最后两场比赛。

我的计划/目标如下:

for elem in result:
    if elem.is_of_type('A'):
        # do stuff
    elif elem.is_of_type('B'):
        # do something else

我如何区分A and B?


getName() 做得很好。您还可以使用标记显式装饰返回的标记,指示进行了哪个匹配:

def makeDecoratingParseAction(marker):
    def parse_action_impl(s,l,t):
        return (marker, t[0])
    return parse_action_impl

A = Word(nums).setParseAction(makeDecoratingParseAction("A"))
B = Word(alphas).setParseAction(makeDecoratingParseAction("B"))
expr = OneOrMore(A | B)

result = expr.parseString("123 abc 456 7 d")
print result.asList()

Gives:

[('A', '123'), ('B', 'abc'), ('A', '456'), ('A', '7'), ('B', 'd')]

现在您可以迭代返回的元组,并且每个元组都标有适当的标记。

您可以更进一步,使用类来捕获类型和特定于类型的解析后逻辑,然后将该类作为表达式的解析操作传递。这将在返回的 ParseResults 中创建类的实例,然后您可以使用某种方法直接执行该实例exec or doIt method:

class ResultsHandler(object):
    """Define base class to initialize location and tokens.
       Call subclass-specific post_init() if one is defined."""
    def __init__(self, s,locn,tokens):
        self.locn = locn
        self.tokens = tokens
        if hasattr(self, "post_init"):
            self.post_init()

class AHandler(ResultsHandler):
    """Handler for A expressions, which contain a numeric string."""
    def post_init(self):
        self.int_value = int(self.tokens[0])
        self.odd_even = ("EVEN","ODD")[self.int_value % 2]
    def doIt(self):
        print "An A-Type was found at %d with value %d, which is an %s number" % (
                self.locn, self.int_value, self.odd_even)

class BHandler(ResultsHandler):
    """Handler for B expressions, which contain an alphabetic string."""
    def post_init(self):
        self.string = self.tokens[0]
        self.vowels_count = sum(self.string.lower().count(c) for c in "aeiou")
    def doIt(self):
        print "A B-Type was found at %d with value %s, and contains %d vowels" % (
                self.locn, self.string, self.vowels_count)


# pass expression-specific handler classes as parse actions
A = Word(nums).setParseAction(AHandler)
B = Word(alphas).setParseAction(BHandler)
expr = OneOrMore(A | B)

# parse string and run handlers
result = expr.parseString("123 abc 456 7 d")
for handler in result:
    handler.doIt()

Prints:

An A-Type was found at 0 with value 123, which is an ODD number
A B-Type was found at 4 with value abc, and contains 1 vowels
An A-Type was found at 8 with value 456, which is an EVEN number
An A-Type was found at 12 with value 7, which is an ODD number
A B-Type was found at 14 with value d, and contains 0 vowels
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区分 pyparsing 中的匹配 的相关文章

随机推荐

  • 如何通过谷歌表格上的查询比较日期或日期与今天?

    我正在努力将sheet1的副本复制到另一个sheet2 同一文档 上 并且query 工作得很好 直到我想要过滤的列是公式单元格 每个都有查询 匹配等的长单元格 我想要做的是过滤sheet1中的行 其中M列中的事件日期即将到来 有更多过滤条
  • JPA 创建 - Hibernate 未显示在平台中

    我正在尝试创建一个使用 Hibernate 作为持久性提供者的 JPA 项目 但是当我单击平台时 它没有显示 Hibernate 它在平台下拉框中显示 Generic 和 EclipseLink 我应该怎么做才能在下拉框下获得 Hibern
  • Python os.system 命令不起作用?

    早些时候 我曾经很好地使用 python 进行编码 但是在我格式化计算机并重新安装相同的 python 设置之后 我的os system命令停止工作 以及subprocess Popen 看来是路径问题 我重现该 1 错误的唯一方法是将路径
  • 我如何告诉 PyCUDA 使用哪个 GPU?

    我的机器中有两张 NVidia 卡 并且都支持 CUDA 当我运行示例脚本以开始使用此处所示的 PyCUDA 时 http documen tician de pycuda http documen tician de pycuda 我得到
  • 使用 ECS Fargate 执行 Step Function“任务”

    在 Re Invent 2018 中 AWS 似乎推出了与 Step Functions 的新集成 其中包括 ECS Fargate 支持 https docs aws amazon com step functions latest dg
  • c_include_path 与 ld_library_path

    在 Ubunutu 12 04 或 Springdale 6 4 上 使用 gcc 和 g 有什么区别C INCLUDE PATH or CPLUS INCLUDE PATH and LD LIBRARY PATH 是个LD一个仅在运行时使
  • 异常消息是英文的吗?

    我们通过将 Exception Message 写入文件来记录系统中发生的任何异常 然而 它们是根据客户的文化编写的 土耳其的错误对我来说意义不大 那么我们如何才能在不改变用户文化的情况下用英语记录错误消息呢 这个问题可以部分解决 框架异常
  • 什么是接口断言?

    我刚刚遇到了这段代码 type Logger interface Debug msg string keyvals interface error Info msg string keyvals interface error Error
  • Python 使用 tenacity 模块重试

    我很难获得坚韧图书馆 https github com jd tenacity按预期工作 下面测试中的重试根本不会触发 我希望每 5 秒重试一次 并让日志文件反映重试尝试 import paramiko import tenacity fr
  • 是否可以设置规则的优先级以避免“最长最早”的匹配模式?

    另一个简单的问题 有没有办法告诉 flex 更喜欢匹配短事物的规则而不是匹配长事物的规则 我找不到任何关于这方面的好的文档 这就是我需要它的原因 我解析一个伪语言文件 其中包含一些与控制指令相对应的关键字 我希望它们成为绝对优先级 这样它们
  • WebAPI OData 日期时间错误

    同样的问题在这里被问到http forums asp net post 5243863 aspx http forums asp net post 5243863 aspx但还没有答案 像 filter TimeRequested eq d
  • 通过 terraform 部署的 AWS API Gateway 和 Lambda 函数 -- 由于配置错误而执行失败:Lambda 函数的权限无效

    我正在通过 Terraform 一起部署 API 网关和 Lambda 函数 而 Lambda 函数应该由 API 网关触发 资源成功部署后 我测试 API 网关并得到响应 message 内部服务器错误 API网关的实际日志显示 由于配置
  • 使 html 表格中的第一列固定,下一列可滚动

    我有一个只有两列的表 我想让第一列固定 下一列在所有行中可滚动 它应该作为一个整体水平滚动 而不是单个列 可以有数百行 我这里有一个演示代码Jsfiddle http jsfiddle net Yw679 1 我对 css 样式接触不多 你
  • 我们可以在其他注释中使用 spring 表达式(spel)吗?

    我希望能够做到这一点 Controller RequestMapping handlerMappingPaths security public class SecurityController etc for instance to re
  • 为什么Scala的尾递归比Java慢?

    使用尾递归进行简单加法的 Scala 代码 def add list List Int sum Int Int Thread dumpStack if list isEmpty sum else val headVal list head
  • C++:Dll 卸载问题

    如何确保 dll 中的任何对象存在时不会被卸载 问题是 当我使用显式内存管理时 我可以在释放 dll 之前删除 dll 对象 但是使用智能指针 我无法控制被破坏的顺序 这意味着 dll 可能会首先被释放 从而在尝试释放时导致崩溃其他对象之一
  • 检查 Google App Engine 中任务队列的状态

    我将多个任务放入任务队列中 并想知道特定任务何时完成 我在 API 中没有找到任何关于回调或检查任务状态的内容 所以我想我应该看看其他人做了什么 或者是否有解决方法 或官方 检查方法 我不关心单个任务 如果有帮助的话 我会放入 6 个不同的
  • CSS 网格:动态跨越最后一列

    是否可以自动跨越最后一列以占据网格中的剩余空间 基本上我正在努力实现这一目标 row display grid grid template columns repeat 3 1fr col background blue padding 2
  • 如何在java中使用谷歌云数据流从云存储读取时跳过csv文件中的回车符

    我有一个 CSV 文件 其中每行都包含新的回车符 n 使用 Apache Beam 的 TextIO read 函数从云存储读取 CSV 文件时 它会将 n 视为新记录 我怎样才能克服这个问题 我尝试过扩展 filebasedsource
  • 区分 pyparsing 中的匹配

    我想用 pyparsing 解析一些单词和一些数字 简单就对了 from pyparsing import A Word nums setResultsName A B Word alphas setResultsName B expr O