一、什么是正则表达式

正则表达式是一个特殊字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配。

应用:快速检索文本、实现一些替换文本的操作

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的更多相关文章

  1. Python(八) 正则表达式与JSON

    一.初识正则表达式 正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配 快速检索文本.实现替换文本的操作 json(xml) 轻量级 web 数据交换格式 impor ...

  2. Python3(七) 正则表达式与JSON

    一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...

  3. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

  4. C# 正则表达式、Json

    正则表达式: 正则表达式主要的参考文章:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html#anchorD. 需求:将cocos ...

  5. python小练--使用正则表达式将json解析成dict

    练习python语法,自己实现了一个简单的解析json字符,存为dict字典对象. { "id":12, "name":"jack", &q ...

  6. Python的正则表达式与JSON

    Python的正则表达式需要导入re模块 菜鸟教程:http://www.runoob.com/python/python-reg-expressions.html 官方文档:https://docs ...

  7. jmeter通过json extrcator或者正则表达式获取json返回信息

    1.下载地址,及插件文档资料 https://jmeter-plugins.org/wiki/JSONPathExtractor/ json信息如下 { "error_code": ...

  8. 正则表达式-获取Json属性值

    需求 需要获取json的字符串参数中的某个属性的值,只用json转对象后再获取层级比较多,所以使用简单的正则表达式进行获取 具体实现 public static void main(String[] ...

  9. Android入门(二十二)解析JSON

    原文链接:http://www.orlion.ga/687/ 解析JSON的方式有很多,主要有官方提供的 JSONObject,谷歌的开源库 GSON.另外,一些第三方的开源库如 Jackson.Fa ...

随机推荐

  1. web 全栈 学习 1 工程师成长思路图

    第一部分: 技术的三个阶段 实现 ---> 借鉴 ---> 优化 实现:为了实现功能,不考虑可读性.借鉴:阅读开源代码,开源程序,学到编程思想.优化:可读性,可执行. 阶段一:实现多做事, ...

  2. SDOI 2017 Day1

    日期:2017-04-10 题解: 第一题: 题目大意:求fi(gcd(i,j))的乘积  i,j属于[1,1e6],数据组数1000组. 类别:套路题. 第二题:BZOJ原题. 题解:LCT套线段树 ...

  3. mvc Bundling 学习记录(一)

    参考博客:http://www.cnblogs.com/xwgli/p/3296809.html 这里要详细记录的是对于现有MVC项目进行Bundling功能 1  如果没有System.Web.Op ...

  4. elementaryos必装软件

    所使用版本:elementaryos-0.4-stable-amd64.20160909.iso vmtools jdk sougouinput IntellijIEAD

  5. PHP的深copy和浅copy

    1.对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 /** * 电视机类 */ class Television { /** * ...

  6. Elasticsearch mapping文档相似性算法

    Elasticsearch allows you to configure a scoring algorithm or similarity per field. The similarityset ...

  7. NO0:重新拾起C语言

    因工作所需,重新捡起C语言,之前在学校里有接触过,但现在已经忘的一干二净了,现决定重新开始学习,为工作,为生活. 以<标准 C程序设计 第5版>的课程进行基础学习,同时以另外两本书为辅助, ...

  8. zero to one (2)

    kali虚拟机整理 关于kali的虚拟机,我搞崩过很多次,重新安装了很多次,也遇到了很多问题,有一些解决不了的就重新安装,费时费力,要善于用虚拟机. 关于网络配置的问题 关于网络配置,在这里我想主要记 ...

  9. Seal Report_20160923

    Seal Report算是报表工具中比较好用的一个,它提供了一个完整的从其他任何数据库产生报表的架构.该产品主要关注于容易安装和报表设计,一旦安装好,报表很快就可以建立并且发布.该组件完全开源,使用C ...

  10. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...