一、什么是正则表达式

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

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

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. POJ - 3278 Catch That Cow 【BFS】

    题目链接 http://poj.org/problem?id=3278 题意 给出两个数字 N K 每次 都可以用三个操作 + 1 - 1 * 2 求 最少的操作次数 使得 N 变成 K 思路 BFS ...

  2. Maven简介(五)——pom.xml

    6       Maven的pom.xml介绍 6.1     简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId ...

  3. Laravel的初始化安装

    Laravel的初始化安装 composer 安装 composer中国镜像laravel文档 curl -sS https://getcomposer.org/installer | php # 修 ...

  4. 畅游HttpCore

    欢迎 非常欢迎阅读本文,本文主要介绍HttpCore是如何工作的. 你应该知道HTTP是一种用于在客户端与服务端进行消息交换的协议.它使用的特别广泛,它通常运行在TCP/IP或者安全的TLS/SSL之 ...

  5. 跟我一起学Git (十) Patches【转】

    本文转载自:http://cs-cjl.com/2014/05/05/learn_git_with_me_10 Git实现了以下三条用于交换patch的命令: git format-patch 用于创 ...

  6. PYTHON 爬虫笔记十一:Scrapy框架的基本使用

    Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...

  7. hadoop集群的安装

    Hadoop集群安装 1.配置JDK环境和设置主机名,本地解析 JDK环境教程: http://www.cnblogs.com/wangweiwen/p/6104189.html 本地解析: vim ...

  8. android自定义控件(五) 自定义组合控件

    转自http://www.cnblogs.com/hdjjun/archive/2011/10/12/2209467.html 代码为自己编写 目标:实现textview和ImageButton组合, ...

  9. OpenCV——PS 滤镜算法之极坐标变换到平面坐标

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  10. 【Shell】Linux 一行 多命令

    http://www.cnblogs.com/koreaseal/archive/2012/05/28/2522178.html 要实现在一行执行多条Linux命令,分三种情况: 1.&&am ...