Python学习笔记九:正则表达式
一:正则表达式的符号与方法
常用符号:
.:匹配任何一个字符,换行符除外(所以,多行字符串中的匹配要特殊处理,见下面实例)
*:匹配前一个字符0次或多次
+:匹配前一个字符1次或多次
?:匹配前一个字符0次或1次
{n,m}:匹配前一个字符n次~m次
():小括号内容作为结果返回
[]:匹配[]内任一元素
.*:贪心匹配,匹配任何一个字符0次或多次
.*?:非贪心匹配
(.*?):把括号内的匹配内容作为结果返回
\w:匹配包括下划线的任何单词字符(即不是特殊符号的字符,符号字符是!@#?之类),相当于[A-Za-z0-9_]
\d:匹配任意数字,等价于 [0-9]
\W:匹配非单词字符。
\D:匹配非数字。
^:模式取非。
常用方法:
findall():匹配符合规则的内容,结果以列表形式返回
search():匹配第一个符合规则的内容,并返回一个正则表达式对象
sub():替换符合规则的内容,返回替换后的值
实例:
# . 的使用:充当一个占位符,一个.代表一个符号
a="xz123"
b=re.findall("x.",a) #第一个参数为查找规则,第二个参数为被查找对象
print b
结果:. 被赋予了具体内容
['xz'] # * 的使用:代表前一个字符出现0次或多次
a="xyxy123"
b=re.findall("x*",a)
print b
结果:逐个匹配:0次则匹配结果为空
['x', '', 'x', '', '', '', '', ''] # ? 的使用:匹配前一个字符0次或1次
a="xxxy123"
b=re.findall("x?",a)
print b
结果:逐位匹配,符合则打印,不符合则为空(注意:最后一位是\n)
['x', 'x', 'x', '', '', '', '', ''] # .* 的使用:贪心匹配,前后界限之间的字符尽可能多地匹配到
code="dfhasjkhxxIxxjkfasl244xxlovexxdhfjkh3455xxyouxxklfjsgdiou5"
b=re.findall("xx.*xx",code)
print b
结果:前后界限为xx xx ,那么被查找对象中xx 与 xx 之间范围会尽量长
['xxIxxjkfasl244xxlovexxdhfjkh3455xxyouxx'] # .*? 的使用:非贪心匹配:. 匹配字符,* 控制字符多少, ? 控制前面的字符子串出现的次数(0次或1次)
code="dfhasjkhxxIxxjkfasl244xxlovexxdhfjkh3455xxyouxxklfjsgdiou5"
b=re.findall("xx.*?xx",code)
print b
结果:符合前后界限的匹配子串会尽量短地匹配到
['xxIxx', 'xxlovexx', 'xxyouxx'] # (.*?) 的使用:. 匹配字符,* 控制字符多少, ? 控制前面的字符子串出现的次数,()控制了返回结果:我们需要的就放在括号里,不需要的就放在括号外
code="dfhasjkhxxIxxjkfasl244xxlovexxdhfjkh3455xxyouxxklfjsgdiou5"
b=re.findall("xx(.*?)xx",code)
print b
结果:把符合前后界限匹配规则的结果中,括号内的匹配内容返回,而省略前后界限
['I', 'love', 'you']
特殊实例:
#多行字符串匹配
#如果按照前面的匹配方式,结果会这样
s='''jhfsdxxhello
xxjhdfxxworldxxh234'''
b=re.findall("xx(.*?)xx",s)
print b
输出:由于 . 不能匹配换行符\n,所以这里只能匹配到同一行中符合规则的内容
['jhdf'] #跨行匹配:使用第三个参数:re.S,使 . 可以匹配\n
s='''jhfsdxxhello
xxjhdfxxworldxxh234'''
b=re.findall("xx(.*?)xx",s,re.S)
print b
结果:
['hello\n', 'world']
比较:search与findall
#search方法
#1:单纯调用
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.search("xx(.*?)xx123xx(.*?)xx",s)
print b
结果:返回第一个匹配对象
<_sre.SRE_Match object at 0x02A92728> #2:要取用具体的匹配内容,需要用group()方法
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.search("xx(.*?)xx123xx(.*?)xx",s).group()
print b
结果:
xxhelloxx123xxworldxx #3:如果规则中有多处(),可以用序号取用匹配结果中的第n处括号内的匹配内容
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.search("xx(.*?)xx123xx(.*?)xx",s).group(1)
print b
结果:括号序号是从1开始的
hello
#findall()
#1:单纯调用,输出结果
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.findall("xx(.*?)xx123xx(.*?)xx",s)
print b
结果:()匹配结果以列表方式返回,一个列表元素是一个元组,元组内容为众括号匹配内容
[('hello', 'world')] #2:对返回结果进行具体取用
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.findall("xx(.*?)xx123xx(.*?)xx",s)
print b[0]
结果:b[0]是一个元组
('hello', 'world') s='jhfsdxxhelloxx123xxworldxxh234'
b=re.findall("xx(.*?)xx123xx(.*?)xx",s)
print b[1]
结果:报错
print b[1]
IndexError: list index out of range #3:由1,2可知,要具体访问一个()的匹配结果,需要用二维数组的形式,第一个下标访问结果列表中的元组,第二个下标访问元组中的具体元素
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.findall("xx(.*?)xx123xx(.*?)xx",s)
print b[0][1]
结果:
world
可见search与findall方法对匹配结果的取用不同:search返回结果以group(i)取用具体括号的匹配内容,findall返回结果以二维数组形式[i][j]取用具体括号匹配内容。
sub()的使用:替换
1:
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.sub("xx(.*?)xx","IiiI",s)
print b
结果:把包括前后缀的匹配模式的匹配内容全部替换了
jhfsdIiiI123IiiIh234 2:
s='jhfsdxxhelloxx123xxworldxxh234'
b=re.sub("xx(.*?)xx123xx(.*?)xx","IiiI",s)
print b
结果:不是按括号分开替换,而是把符合匹配规则的一整块内容替换
jhfsdIiiIh234
二:一些使用技巧
1:建议使用import re,然后在代码中使用 re.XX 调用方法、常量,来方便区分正则内容与代码中自定义的内容。
2:不建议使用compile方式进行正则表达式匹配。
compile方式的正则表达式的使用:
#1:创建被查找的对象
s='jhfsdxxhelloxx123xxworldxxh234'
#2:定义正则字符串
pattern_str="xx(.*?)xx"
#3:使用compile根据正则字符串创建模式
pattern=re.compile(pattern_str,re.S)#第二个参数是模式控制常量:如这里S是令.可以匹配\n
#4:使用findall、search方法进行内容查找
res=re.findall(pattern,s)
print res
结果:
['hello', 'world']
不建议这样使用的原因:
在findall方法中,调用了_compile()方法创建模式;
而compile()方法底层其实就是return _compile(str),之后再调用findall(pattern,s)时又调用一次_compile(str)就是多此一举了。
因此,我们不需要先compile,直接把正则字符串传给findall(str,s)作为匹配模式即可。
Python学习笔记九:正则表达式的更多相关文章
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- Python学习笔记013_正则表达式
Python中的正则表达式是通过 re 模块实现的. 通配符 . 表示除了换行以外的任何字符; 编写正则表达式时使用 r're' , r + 正则表达式内容 >>> impor ...
- python学习笔记(九)、模块
1 模块 使用import 语句从外部导入模块信息,python提供了很大内置模块.当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Pyt ...
- python学习笔记之——正则表达式
1.re模块 Python通过re模块提供对正则表达式的支持,re 模块使 Python 语言拥有全部的正则表达式功能.使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用 ...
- python 学习笔记九 队列,异步IO
queue (队列) 队列是为线程安全使用的. 1.先入先出 import queue #测试定义类传入队列 class Foo(object): def __init__(self,n): self ...
- python学习笔记九——序列
4.4 序列 序列是具有索引和切片能力的集合.元组.列表和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力,因此元组.列表和字符串都属于序列.序列索引功能演示: tuple=(&quo ...
- Python学习笔记九:装饰器,生成器,迭代器
装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...
- Python学习笔记 - day10 - 正则表达式
正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...
- Python学习笔记(正则表达式)
\b - 表示以什么开头或结尾 \d - 匹配数字 \w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以) \s - 匹配任意的空白符 ^ - 匹配字符串 ...
随机推荐
- java如何直接返回excel到客户端
既然是web项目首先你得拿到响应才能向外部写出,你得拿到响应对象response,1.添加如下两行代码response.setContentType("application/vnd..ms ...
- 广告狂人第一至七季/全集Mad Men迅雷下载
广告狂人 第一季 Mad Men Season 1 (2007) 本季看点:你是谁?你想要什么?你爱乾什么?这些都不重要,重要的是你怎么把东西卖出去.凡是了解纽约的人都知道,今天,在麦迪逊大道(Mad ...
- 摩登家庭第一季/全集Modern Family迅雷下载
本季Modern Family Season 1 第一季(2009)看点:<摩登家庭>瞄准的是三对各有不同的美国家庭:一对普通父母与三个孩子.一对同性恋夫夫从越南领养了养女组成三口之家,一 ...
- cocos2d-x中使用CCOrbitCamera做水平翻转
项目中需要用到水平翻转效果,这里偷懒了- 首先翻转,它只是转到了180度,多了就觉得很奇怪了. 所以这里设定就是先从0 ~ 90度,然后再从270 ~ 360,90 – 270 视觉上是感觉不到变 ...
- jquery validate验证方法
实例: equalTo方法 equalTo(其他)返回:布尔 说明:要求元素与另一个元素相同 等于(其他) 其他 类型:选择器 元素的选择器用于比较当前值 例子: 使“字段”必须与#other相同 1 ...
- [Web 前端] this作用域问题
如何不用这种写法:理想的写法是this.setState({ .... }) 可能是我没有描述清楚,我不想用这种学法而已,这样多了一个变量,我觉得很不舒服.我尝试了先把 setState 赋值到变量里 ...
- [Android Security] 如何把java代码转换成smali代码
copy :https://www.cnblogs.com/gordon0918/p/5466514.html 1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中 ...
- 关于XSHM(Cross-Site History Manipulation)
http://blog.chinaunix.net/uid-27070210-id-3255407.html 乍一看,好像和以前 css history hack 差不多,其实原理还是不一样的.浏览器 ...
- Cesium学习笔记(七):Demo学习(自由控制飞行的飞机)[转]
https://blog.csdn.net/umgsoil/article/details/74923013# 这是官方的教程Demo,名字叫Use HeadingPitchRoll,顾名思义,就是教 ...
- 解决ASP.NET中的各种乱码问题
解决ASP.NET中的各种乱码问题 阅读目录 开始 页面显示乱码问题 AJAX提交的数据乱码问题 JavaScript中正确的URL编码方式 ASP.NET中正确的URL编码方式 正确的URL编码方式 ...