十、正则表达式和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 ...
随机推荐
- POJ - 3278 Catch That Cow 【BFS】
题目链接 http://poj.org/problem?id=3278 题意 给出两个数字 N K 每次 都可以用三个操作 + 1 - 1 * 2 求 最少的操作次数 使得 N 变成 K 思路 BFS ...
- Maven简介(五)——pom.xml
6 Maven的pom.xml介绍 6.1 简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId ...
- Laravel的初始化安装
Laravel的初始化安装 composer 安装 composer中国镜像laravel文档 curl -sS https://getcomposer.org/installer | php # 修 ...
- 畅游HttpCore
欢迎 非常欢迎阅读本文,本文主要介绍HttpCore是如何工作的. 你应该知道HTTP是一种用于在客户端与服务端进行消息交换的协议.它使用的特别广泛,它通常运行在TCP/IP或者安全的TLS/SSL之 ...
- 跟我一起学Git (十) Patches【转】
本文转载自:http://cs-cjl.com/2014/05/05/learn_git_with_me_10 Git实现了以下三条用于交换patch的命令: git format-patch 用于创 ...
- PYTHON 爬虫笔记十一:Scrapy框架的基本使用
Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...
- hadoop集群的安装
Hadoop集群安装 1.配置JDK环境和设置主机名,本地解析 JDK环境教程: http://www.cnblogs.com/wangweiwen/p/6104189.html 本地解析: vim ...
- android自定义控件(五) 自定义组合控件
转自http://www.cnblogs.com/hdjjun/archive/2011/10/12/2209467.html 代码为自己编写 目标:实现textview和ImageButton组合, ...
- OpenCV——PS 滤镜算法之极坐标变换到平面坐标
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- 【Shell】Linux 一行 多命令
http://www.cnblogs.com/koreaseal/archive/2012/05/28/2522178.html 要实现在一行执行多条Linux命令,分三种情况: 1.&&am ...