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 ...
随机推荐
- 工控随笔_20_西门子_WinCC的VBS脚本_09_常量和流程控制_02
vbs不但提供了分支结构,还提供了丰富的循环形式.一共有3种循环: 1.for循环 2.do...loop循环 3.while循环 各种循环有各自的特点,在使用的时候可以进行转换. 前面已经描述过Fo ...
- RAMOS测速
WIN7X64-DDR31600-RAMOS测速,连续读取17GB/S,连续写入10GB/S,4K读写都是1GB/S左右.不错哦.
- css -理解盒模型
标准模式: 总宽度/高度=width/height+padding+border+margin 怪异模式(quirks 模式): 总宽度/高度=width/height + margin = 内容区宽 ...
- vim YouCompleteMe 遇到的问题及解决
问题1: 补充,升级gcc,g++ 到4.7以上的版本才能安装成功 github 官网 github https://github.com/Valloric/YouCompleteMe#ubuntu- ...
- [css选择器]总结:IE6不支持的CSS选择符
转载地址:https://www.wenjiwu.com/doc/zvsbii.html.此文最后也给出了原文地址,但是我点击过去发现是什么赌博彩票的地址,360也弹出小心的提示,所以这里只给出了我转 ...
- ES6系列之解构
本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...
- Logic and Proofs--离散数学
Propositions: A proposition is a declarative sentence(that is, a sentence that declares a fact ) tha ...
- SQL对于 小数处理的小结
DECLARE @digital INT --截断小数位 ,,)),@digital) AS 截断小数位 --上抛小数位 ,,)),@digital) AS 上抛小数位 SELECT CEILING ...
- linux下怎么清理缓存
free -m 命令可以查看内存使用情况 sysctl 命令可以临时改变某个系统参数 如:sysctl -w net.ipv4.ip_forward=1 是将forware参数临时改为1 当 ser ...
- 各平台操作系统查询主机WWPN
查询主机WWPN 目录 3.4.3.8.2.3 查询主机WWPN 3.4.3.8.2.3.1 查看主机HBA相应端口的WWPN(Windows) 3.4.3.8.2.3.2 查看主机HBA相应端口的W ...