pyparsing自定义解析规则
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自定义解析规则的更多相关文章
- Spring Boot 学习系列(05)—自定义视图解析规则
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- AutoMapper之自定义解析
自定义解析 4.自定义解析 AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理.AutoM ...
- Reface.NPI 方法名称解析规则详解
在上次的文章中简单介绍了 Reface.NPI 中的功能. 本期,将对这方法名称解析规则进行详细的解释和说明, 以便开发者可以完整的使用 Reface.NPI 中的各种功能. 基本规则 方法名称以 I ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- Newtonsoft.Json 自定义 解析协议
在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...
- struts2 自定义校验规则
自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...
- yii2中自定义验证规则rules
作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
随机推荐
- linux与C内存管理机制
转自知乎专栏:https://zhuanlan.zhihu.com/p/51855842?utm_source=wechat_session&utm_medium=social&utm ...
- 用matalb、python画聚类结果图
用matlab %读入聚类后的数据, 已经分好级别了,例如前4行是亚洲一流, %-13是亚洲二流,-24是亚洲三流 a=xlsread('C:\Users\Liugengxin\Desktop\1.x ...
- leetcode70 爬楼梯 Python
组合数学Fibonacci 例3.4.1 (上楼梯问题)某人欲登上n级楼梯,若每次只能跨一级或两级,问他从地面上到第n级楼梯,共有多少种不同的方法? (解)设上到第n级楼梯的方法数为an.分类统计 ...
- Zabbix调优不完全指南(https://www.jianshu.com/p/2d911d55448f)
从学习搭建zabbix到完成各类监控.调优.二次开发已经过去了两年,期间通过QQ学习群.zabbix官方社区.各个技术博客整理学习了不少关于各种报错的处理方法,现在将常见的一些报错处理方法整理出来分享 ...
- 对象名 'dbo.__MigrationHistory' 无效 错误解决
// 在数据库上下文的构造方法里 public GewPeAppContext() : base(ConnectionStrings.GewPeAppConnectionString) { // 添加 ...
- 1-web.xml配置说明
编写第一个Servlet程序 重要的在于如何去配置项目中的web.xml文件 <servlet-class> 设置servlet程序全限定路径 也就是在项目的中路径 <servl ...
- On-die termination for DDR
本文转载自: https://blog.csdn.net/weixin_38233274/article/details/81016870 ODT是什么鬼?为什么要用ODT?在很多关于DDR3的博文和 ...
- 影响solr性能的一些因素(附使用经验)
Solr本身的性能不错,但是在使用过程中,还是会遇到一些使用错误,或是没考虑到的地方:在出现瓶颈时,可以首先考虑哪些点呢?下面就来看一下Solr官方的总结,个人觉得总结的很好.SOLR+LUCENE的 ...
- 位运算练习:将整数A转换为B,需要改变多少个bit位
思路解析: 将整数A转换为B,如果A和B在第i(0<=i<32)个位上相等,则不需要改变这个BIT位,如果在第i位上不相等,则需要改变这个BIT位.所以问题转化为了A和B有多少个BIT位不 ...
- 为什么vue支持IE9以上的IE浏览器?
原因如下: 1.vue框架中核心的双向绑定原理是利用Object.defineProperty()方法实现的. 2.该方法第一个被实现是在IE8中,但是存在诸多限制:只能在DOM对象上使用这个方法,而 ...