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. 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架

    链接:http://blog.sina.com.cn/s/blog_13cc013b50102w94u.html

  2. JSON AST 生成MD

    使用 JsonLite 获取 JSON  AST class Program { static void Main(string[] args) { string fileName = $" ...

  3. 采用Anaconda平台调用pymc3时出现错误的解决方法

    提示:(1)module 'theano' has no attribute 'gof',c++编辑出现错误 (2)stdio.h file not found 解决方法:(1)在终端中输入 xcod ...

  4. TypeScript安装备忘:npm proxy设置

    如果使用了代理网络,因为npm无法自动识别Internet代理,则需要手动设置npm代理才能下载包. 设置命令:    npm config set proxy http://proxyhost:pr ...

  5. 知识点:Mysql 数据库索引优化实战(4)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...

  6. Galaxy2D Game Engine 4.2

    Galaxy2D Game Engine 4.2 开发版  下载地址  D3DRender注意:1.下载后的压缩包请使用WinRar5.0打开.2.开发版包含了现在正在开发中的Galaxy2D游戏引擎 ...

  7. C# 文字滚动特效(上下滚动)

    本程序改编至网上下载的一个自定义控件,原控件是左右滚动效果,类似于跑马灯效果,由于项目需要,改编为上下滚动. 前期没有实现自动折行,今天刚加上自动折行. using System; using Sys ...

  8. java连Oracle连接字符串写法

    JDBC URL: 1.ServiceName方式:jdbc:oracle:thin:@//<host>:<port>/ServiceName 如果是集群,不知道为什么是在配置 ...

  9. oracle锁表+解锁

    一.锁表: LOCK TABLE tablename IN EXCLUSIVE MODE; 二.解锁 * 1.首先用dba账户登录数据库 * * 2.查出被锁定的对象 * select * from ...

  10. leetCode83. 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...