十、正则表达式和JSON
一、什么是正则表达式
正则表达式是一个特殊字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配。
应用:快速检索文本、实现一些替换文本的操作
1、检查一串数字是否是电话号码
2、检查一个字符串是否符合email
3、把一个文本里指定的单词替换为另外一个单词
例:
a='C|C++|Java|C#|Python|Javascript'
判断a中是否包含Python
方法一:使用python内置方法
1) a.index('Python')>-1:
a='C|C++|Java|C#|Python|Javascript' if a.index('Python')>-1:
print(True)
else:
print(False)
2)'Python' in a
a='C|C++|Java|C#|Python|Javascript'
if 'Python' in a:
print(True)
else:
print(False)
方法二:使用正则表达式
#coding=utf-8
import re a='C|C++|Java|C#|Python|Javascript'
r=re.findall('Python',a)
print(r)
if len(r)>0:
print(u'字符串中包含Python')
else:
print(u'字符串中不包含Python')
以上例子中‘Python’是常量字符串,几乎无意义。正则表达是的意义或者灵活即:规则
二、元字符与普通字符
a='C0C++7Java8C#9Python6Javascript'
查找a中所有的数字
#coding=utf-8
import re
a='C0C++7Java8C#9Python6Javascript'
r=re.findall('\d',a)
print(r)
总结:以上两个例子中Python是普通字符,\d是元字符
正则表达式是由一系列的普通字符和元字符所组成的
正则表达式有很多,在实际工作中根据需要查找即可
三、字符集
字符集由[]括起来的一组字符组合,字符之间是或者的关系,^代表非,-代表范围
字符集两边常常由普通字符构成,如‘a[cf]c’,普通字符a、c用来定界
#coding=utf-8
import re
'''
字符集的使用
'''
s = 'abc,acc,adc,aec,afc,ahc'
#查找s中,中间一个字符是c或f的单词
r=re.findall('a[cf]c',s)
print(r) #查找s中,中间一个字符不是c也不是f的单词
r1=re.findall('a[^cf]c',s)
print(r1) #查找s中,中间一个字符是c\d\e\f的单词
r2=re.findall('a[c-f]c',s)
print(r2)
四、概括字符集
像\d、\D、\w这种具有高度概括的表达式,我们称为概括字符集
#coding=utf-8
import re
'''
概括字符集
'''
a='Python 1111Java678php'
# r=re.findall('[0-9]',a)
r=re.findall('\d',a)
print(r)
五、数量词
数量词{}表示个数
如{3}表示3位;{3,6}表示最小3位,最大6位
#coding=utf-8
import re
'''
数量词{}
'''
a='Python 1111\nJava678php'
#检索所有单词
# r=re.findall('[a-z]{3}',a)
#Python6位,Java4w位,php3位,所以取3到6位
r=re.findall('[a-zA-Z]{3,6}',a)
print(r)
六、贪婪与非贪婪
正则表达式默认是尽可能使用贪婪的匹配方式
非贪婪,后面加?
#coding=utf-8
import re
'''
贪婪与非贪婪
'''
a='Python 1111\nJava678php'
#贪婪方式匹配
r=re.findall('[a-zA-Z]{3,6}',a)
print(r)
#非贪婪方式匹配
r1=re.findall('[a-zA-Z]{3,6}?',a)
print(r1)
七、匹配0次1次无限次
#coding=utf-8
import re
a='pytho0python1pythonn2'
r=re.findall('python*',a)
r1=re.findall('python+',a)
r2=re.findall('python?',a)
print(r)
print(r1)
print(r2)
关于?
1、作为非贪婪匹配方式?前面是范围
2、作为数量词?前面是普通字符
#coding=utf-8
import re
a='pytho0python1pythonn2' r=re.findall('python{1,2}',a)
r1=re.findall('python{1,2}?',a)
r2=re.findall('python?',a)
print(r)
print(r1)
print(r2)
八、边界匹配符
例如:
#coding=utf-8
import re # qq='100001'
# qq='101'
qq=''
#检查qq号码是否符合4-8位数字
r=re.findall('\d{4,8}',qq)
print(r)
使用正则表达式'\d{4,8}'可以检测出4-8位,小于4位,但是大于8位时,无法检测,正确做法是使用首尾匹配
#coding=utf-8
import re qq=''
# qq='101'
# qq='100000001'
#检查qq号码是否符合4-8位数字
r=re.findall('\d{4,8}$',qq)
print(r)
九、组
()小括号括起来的称为一组
#coding=utf-8
import re
a='PythonPythonPythonPythonPython*%%php'
#检测a中是否包含3个Python
r=re.findall('(Python){3}',a)
print(r)
十、匹配模式参数flag
findall(pattern, string, flags=0)方法中的第三个参数flags代表匹配模式
常用的匹配模式有
#coding=utf-8
import re
s = 'PythonC#\rJava\nPHP'
#使用re.I和re.S匹配模式,多个模式直接用|分隔
r=re.findall('c#',s,re.I|re.S)
print(r)
#coding=utf-8
import re
s = 'PythonC#\rJavaC#\nPHP'
#使用re.I和re.S匹配模式,多个模式直接用|分隔
r=re.findall('c#.{1}',s,re.I|re.S)
print(r)
十一、re.sub正则替换
#coding=utf-8
import re s='PythonC#JavaC#phpC#'
r=re.sub('C#','GO',s,2)
r1=s.replace('C#','GO',1)
print(r)
print(r1)
其中‘GO’可以是函数
# coding=utf-
import re s = 'PythonC#JavaC#phpC#' # r=re.sub('C#','GO',s,)
def convert(value):
pass
r = re.sub('C#', convert, s)
print(r)
运行结果:
调用过程:
1)C#作为convert的参数
2)convert的返回作为re.sub()的参数,因无返回值所以替换后字符串中的C#消失了
打印value发现结果显示的是对象且被调用了三次(因为设置了参数3)
要获取值C#,需要用group()方法
# coding=utf-
import re s = 'PythonC#JavaC#phpC#' def convert(value):
matched=value.group()
print(matched)
return '!!'+matched+'!!' r = re.sub('C#', convert, s)
print(r)
12、把函数作为参数传递
上面convert是较为简单的函数,实际中常常使用更为复杂的函数,作为sub()参数
# coding=utf-
import re s = 'A8C3711D86' # 找出s中所有数字,大于6的替换为9,小于6的替换为0
def convert(value):
matched = value.group()
res = None
if int(matched) >= :#注意matched是str格式,需要转成int格式
res = ''#数字不能作为返回值,需要将int转成str
else:
res = ''
return res r = re.sub('\d', convert, s)
print(r)
convert:你给我个字符串,我还你个字符串。至于中间变量value如何处理,不关心
思考:s中大于50的替换为100,小于50的替换为0
# coding=utf-8
import re s = 'A8C3711D86' # 找出s中所有数字,大于6的替换为9,小于6的替换为0
def convert(value):
matched = value.group()
res = None
if int(matched) >= 50:#注意matched是str格式,需要转成int格式
res = ''#数字不能作为返回值,需要将int转成str
else:
res = ''
return res r = re.sub('\d{2}', convert, s)
print(r)
13、search与match
实际没有findall好用
match:尝试从字符串首字母开始匹配,如果找不到返回None,找到第一个即返回。
search:尝试搜索整个字符串,找到第一个即返回
#coding=utf-8
import re
'''
检索所有数字
'''
s='A83C72D8E67' r=re.match('\d',s)
#从首字母开始匹配数字
print(r)
r1=re.search('\d',s)
#返回对象,包含位置信息等
print(r1)
#获取查询结果,匹配一次即返回
print(r1.group())
十、正则表达式和JSON的更多相关文章
- Python(八) 正则表达式与JSON
一.初识正则表达式 正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配 快速检索文本.实现替换文本的操作 json(xml) 轻量级 web 数据交换格式 impor ...
- Python3(七) 正则表达式与JSON
一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...
- 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)
解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...
- C# 正则表达式、Json
正则表达式: 正则表达式主要的参考文章:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html#anchorD. 需求:将cocos ...
- python小练--使用正则表达式将json解析成dict
练习python语法,自己实现了一个简单的解析json字符,存为dict字典对象. { "id":12, "name":"jack", &q ...
- Python的正则表达式与JSON
Python的正则表达式需要导入re模块 菜鸟教程:http://www.runoob.com/python/python-reg-expressions.html 官方文档:https://docs ...
- jmeter通过json extrcator或者正则表达式获取json返回信息
1.下载地址,及插件文档资料 https://jmeter-plugins.org/wiki/JSONPathExtractor/ json信息如下 { "error_code": ...
- 正则表达式-获取Json属性值
需求 需要获取json的字符串参数中的某个属性的值,只用json转对象后再获取层级比较多,所以使用简单的正则表达式进行获取 具体实现 public static void main(String[] ...
- Android入门(二十二)解析JSON
原文链接:http://www.orlion.ga/687/ 解析JSON的方式有很多,主要有官方提供的 JSONObject,谷歌的开源库 GSON.另外,一些第三方的开源库如 Jackson.Fa ...
随机推荐
- java.sql.SQLException: Access denied for user 'somebody'@'localhost' (using password: YES)
用mybatis和spring整合时出现了一个错误: 我是在IntelliJ IDEA上整合Mybatis和Spring的,运行测试用例出现了如上错误. 红色的马赛克部分是我的名字. 问题是,我的数据 ...
- IP服务-计算机网络
如需转载请联系:fengxw6@mail2.sysu.edu.cn 未经许可,禁止转载,私人笔记,码字不易,望理解. ---Sun Yat-sen University 冯兴伟 本节主要就讲网络层的各 ...
- Ubuntu 17.4下如何安装和配置flash player
Ubuntu Linux系统下没有自带的flash player,要自己手动安装.下面post出简单的安装过程. 首先打开终端,输入命令:sudo apt-get install flashplugi ...
- Es6 学习笔记(一)数组扩展
扩展运算符 ... 1.数组的扩展运算符将一个数组转换成一个逗号分隔的参数序列 console.log(...[1,2,3]) //1,2,3 ['a', 'b',...[1,3]] //a, ...
- linux下MySQL5.6安装记录
MySQL下载地址: ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.6/http://mirrors.sohu.com/mysql/ ...
- OP趋势系统
经过3年多时间的摸索,经历过熊市牛市的历练,终于完成坚持已久的OP趋势系统的实践,接下来,我将在股灾后,每天都分享OP趋势系统的信号,可以很负责任的说,经过10年历史数据的测试,加上3年的实盘,更加坚 ...
- OpenCV——花环生成函数
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- 洛谷 P2962 [USACO09NOV]灯Lights
题目描述 Bessie and the cows were playing games in the barn, but the power was reset and the lights were ...
- codevs 3314 魔法森林
传送门 3314 魔法森林 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 为了得到书法大家的真传,小E同学下定 ...
- poj1742硬币——多重背包可行性
题目:http://poj.org/problem?id=1742 贪心地想,1.如果一种面值已经可以被组成,则不再对它更新: 2.对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此 ...