十、正则表达式和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 ...
随机推荐
- iOS app submission : missing 64-bit support
- HTML5/CSS3超酷环形动画菜单
在线演示 本地下载
- HAOI 2017 游记
省选 2017年4月23日 流水账式游记,不喜勿喷. Day0: 准备出发,上午敲了一顿板子,板子敲完了就打小游戏,老师也不管了. 过程中各种奶,说什么今年一定考仙人掌啦,今年一定考字符串啦,今年一定 ...
- UVA10294 Arif in Dhaka (First Love Part 2) —— 置换、poyla定理
题目链接:https://vjudge.net/problem/UVA-10294 题解: 白书P146~147. 为什么旋转i个间距,就有gcd(i,n)个循环,且每个循环有n/gcd(i,n)个元 ...
- 浅析android中的依赖注入
这几年针对Android推出了不少View注入框架,例如ButterKnife.我们首先来了解一下使用这些框架有什么好处,其实好处很明显:它可以减少大量的findViewById以及setOnClic ...
- 分享知识-快乐自己:oracle表分区详解
从以下几个方面来整理关于分区表的概念及操作: 1)表空间及分区表的概念: 2)表分区的具体作用: 3)表分区的优缺点: 4)表分区的几种类型及操作方法: 5)对表分区的维护性操作: 1):表空间及分区 ...
- druid相关的时间序列数据库——也用到了倒排相关的优化技术
Cattell [6] maintains a great summary about existing Scalable SQL and NoSQL data stores. Hu [18] con ...
- springAOP原理以及概念
需求:1.拦截所有业务方法2.判断用户是否有权限,有权限就让他执行业务方法,没有权限就不允许执行.(是否有权限是根据user是否为null作为判断依据) 思考: 我们该如何实现? 思路1: 我们在每个 ...
- 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP
题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...
- 【Lintcode】046.Majority Number
题目: Given an array of integers, the majority number is the number that occurs more than half of the ...