1.Word(token)

用于匹配由允许的字符集组成的单词,常见的错误是使用特定字符串Word("expr")匹配"expr"

- L {alphas}  字母
 - L {nums}  数字
 - L {alphanums} 数字字母混合

2.Suppress

忽略表达式中内容

import pyparsing as pp

source = "a , b, c, d"
wd = pp.Word(pp.alphas)
wd_list = wd + pp.ZeroOrMore(','+ wd)
print wd_list.parseString(source)
# result ['a', ',', 'b', ',', 'c', ',', 'd'] # ZeroOrMore
wd_list = wd +pp.ZeroOrMore(pp.Suppress(',')+wd) print wd_list.parseString(source)
# ['a', 'b', 'c', 'd']

3. Group 

使用group将返回的结果,使匹配的合成一个字符串

from pyparsing import *

wd = Word(alphas)
comma = Literal(",")
greetee = OneOrMore(wd)
end = oneOf("! ?")
greeting = wd + comma + greetee + end
# result::['Hello', ',', 'World', '!']
print greeting.parseString("Hello,World!")
wd = Group(Word(alphas))
comma = Literal(",")
greetee = OneOrMore(wd)
end = oneOf("! ?")
greeting = wd + comma + greetee + end
# [['Hello'], ',', ['World'], '!']
print greeting.parseString("Hello,World!")
from pyparsing import *

wd = Word(alphas)
comma = Literal(",").suppress()
greetee = OneOrMore(wd)
end = oneOf("! ?").suppress()
greeting = wd + comma + greetee + end
#['Hello', 'World']
print greeting.parseString("Hello,World!")

 4. setResultsName 给每一个token匹配起一个漂亮的名字

给匹配的token起一个名字,方便在解析后的ParseResults对象中像字典一样调用

from pyparsing import *

integer = Word(nums)
date_str = (integer("year")+'/'+integer("month")+'/'+integer("day"))
# integer("year") equivalent to interger.setResultsName("year")
data = date_str.parseString('2019/04/17') # year,type:<type 'str'>,value:2019
print('year,type:%s,value:%s' %(type(data.year),data.year))

5 setParseAction 对每个解析的token进行处理

处理的方法可以自定义,其中三个参数见下

- s   = the original string being parsed (see note below) # 原字符串
- loc = the location of the matching substring # 匹配的token所处位置
- toks = a list of the matched tokens # 匹配的token列表 比如想对上例中的日期转为int数字,可以自定义一个parseAction,如下:
from pyparsing import *

integer = Word(nums).setParseAction(lambda s,lo,tokens:int(tokens[0]))

date_str = (integer("year")+'/'+integer("month")+'/'+integer("day"))
data = date_str.parseString('2019/04/17') # year,type:<type 'int'>,value:2019
print('year,type:%s,value:%s' %(type(data.year),data.year))

6. parseString 解析传入的字符串

   str:第一个参数传入需要解析字符串

 parseAll: 第二个参数是否为完全匹配解析。1.解析配置的模式必须与字符串一致,否则会报错。2.匹配的tokens放置在tokens列表中,在上面定义parseAction时,使用tokens[0],因为token中只有一个匹配的token,但在此种模式下,tokens中可能存在多个token

7. delimitedList 只需要传入一个匹配格式,就可以 Word,Word....若干个匹配,默认每个Word使用逗号断开

om pyparsing import Word, alphas, alphanums, Combine, oneOf, Optional, delimitedList, Group, Keyword

testdata = """
int func1(float *vec, int len, double arg1);
int func2(float **arr, float *vec, int len, double arg1, double arg2);
"""
# function retun type is alphas and function name is number,alphas and _
ident = Word(alphas, alphanums + "_")
# define var: var type and before var name *.
vartype = Combine( oneOf("float double int char") + Optional(Word("*")), adjacent = False)
# return type and var name or * var name
arglist = delimitedList(Group(vartype("type") + ident("name"))) functionCall = Keyword("int") + ident("name") + "(" + arglist("args") + ")" + ";" for fn,s,e in functionCall.scanString(testdata):
print(fn.name)
for a in fn.args:
print(" - %(name)s (%(type)s)" % a) # output:
# func1
# - vec (float*)
# - len (int)
# - arg1 (double)
# func2
# - arr (float**)
# - vec (float*)
# - len (int)
# - arg1 (double)
# - arg2 (double)

 

pyparsing自定义解析规则的更多相关文章

  1. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  3. AutoMapper之自定义解析

    自定义解析 4.自定义解析 AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理.AutoM ...

  4. Reface.NPI 方法名称解析规则详解

    在上次的文章中简单介绍了 Reface.NPI 中的功能. 本期,将对这方法名称解析规则进行详细的解释和说明, 以便开发者可以完整的使用 Reface.NPI 中的各种功能. 基本规则 方法名称以 I ...

  5. PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则

    PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...

  6. Newtonsoft.Json 自定义 解析协议

    在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...

  7. struts2 自定义校验规则

    自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...

  8. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  9. CI 框架中的自定义路由规则

    在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...

随机推荐

  1. soapui的简单使用

    工具下载地址:https://www.soapui.org/downloads/soapui.html 名词解释 https://www.cnblogs.com/fcfblog/p/5830205.h ...

  2. rocketmq(三 java操作rocket API, rocketmq 幂等性)

    JAVA操作rocketmq: 1.导入rocketmq所需要的依赖: <dependency> <groupId>com.alibaba.rocketmq</group ...

  3. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

  4. 搭建Mock Server

    1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...

  5. [SQL]事务回滚详解及示例

    存储过程中的 SET XACT_ABORT ON 和事务 在存储过程中写SET XACT_ABORT ON 有什么用? SET XACT_ABORT ON是设置事务回滚的! 当为ON时,如果你存储中的 ...

  6. Ubuntu系统配置

    0.基本配置 0.1初始设置 (1)开户root账号并重启系统: 打开gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 添加greeter- ...

  7. 如何将composer设置为全局变量?

    全局安装是将 Composer 安装到系统环境变量 PATH 所包含的路径下面,然后就能够在命令行窗口中直接执行 composer 命令了. Mac 或 Linux 系统: 打开命令行窗口并执行如下命 ...

  8. Django框架之中间件与Auth

    Django框架之中间件与Auth模块一 cbv加装饰器 -先导入:from django.utils.decorators import method_decorator -1 可以在方法上加装饰器 ...

  9. java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  10. Android 开发 Activity里获取View的宽度和高度 转载

    原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...