文档章节

Python 学习笔记 - 正则表达式模块

乐搏学院
 乐搏学院
发布于 2017/04/01 14:57
字数 1540
阅读 8
收藏 0

Python里面,处理字符串除了基本的split,格式化操作等等,还可以使用正则表达式。使用正则表达式,需要导入模块re。正则本身也是一门语言,像下围棋一样,入门很容易,不过要玩的很溜就得花时间了。

 

老实说,老男孩13期的正则表达式的视频真的很烂,那个讲课的估计是个新人,说话颠三倒四,逻辑混乱,豆子听完还是稀里糊涂。

 

课后在网上找到一篇强文

http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

 

拜读之后,受益匪浅。

 

基本规则如下所示:

wKioL1fWmZDyqQSPAAJ4eW9k7oo739.png

 

re模块有下面几个常用的函数

 

1. findall(pattern, string, flags=0),这个函数会返回一个列表,列表的元素是匹配到的字符串

 

例1,下面会匹配出以a开头的所有单词,\w+表示一个或者多个字母数字或者下划线,因为不包括空格,所以相当于单个的单词了

1

2

3

4

>>> import re

ret=re.findall('a\w+','abc aaa bbh kjk hkk add')

print(ret)

['abc''aaa''add']

 

例2,在字符集里面的元素可以表示或的意义。字符集里面特殊的字符会失去意义;但是他本身有2个特殊的字符,-表示范围,^表示取反,比如说我需要查找加减乘除的符号,那么-因为有特殊含义,因此需要用转移符\转义

1

2

3

4

>>> import re

a=re.findall('[+\-*/]\d','3+3-2*4/2')

print(a)

['+3''-2''*4''/2']

 


2. search(pattern,string,flags)会通过pattern去匹配,如果匹配成功,会返回一个match对象,否则返回None。然后可以通过group()函数获取对象里面的字符串

 

例3

1

2

3

4

5

6

>>> import re

obj = re.search('\d+''123uuasf')

if obj:

    print(obj.group())

-------------

123

 

3. match(pattern,string,flags)会通过pattern去匹配,如果匹配成功,会返回一个match对象,否则返回None。然后可以通过group()函数获取对象里面的字符串。他和search的区别在于match只能匹配字符串开头的字符,后面的无法匹配;而search可以匹配到任意位置的字符串。

 

例4

1

2

3

4

5

6

import re

obj = re.match('\d+''u123uu888asf')

if obj:

    print(obj.group())

-------------

123

 

4.finditer(pattern,string,flags) 搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。 

 

例5,我希望匹配一个括号内的四则运算

 

注意他们的区别,search和match都返回了match对象,然后可以通过group获取字符串;而findall返回的是列表,因为我使用了圆括号分组,因此他会返回圆括号里面的内容;如何获取所有的内容呢,可以通过 finditer,他相当于一个加强版的search,会找到所有match对象放入一个列表,我们可以循环这个列表然后获取每个元素的group内容。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

>>> a=re.match('\(([+\-*/]?\d+\.?\d*){1,}\)','(-3.2)-2*2+(2-3*(22-3*3))')

print(a.group())

print('search'.center(40,'-'))

a=re.search('\(([+\-*/]?\d+\.?\d*){1,}\)','2-(3*(2.2-3*3))')

print(a.group())

print('findall'.center(40,'-'))

a=re.findall('\(([+\-*/]?\d+\.?\d*){1,}\)','(-3.2)-2*2+(2-3*(22-3*3))')

for item in a:

    print(item)

print('finditer'.center(40,'-'))

a=re.finditer('\(([+\-*/]?\d+\.?\d*){1,}\)','(-3.2)-2*2+(2-3*(22-3*3))')

for item in a:

    print(item.group())

-------------------------------------------

(-3.2)

-----------------search-----------------

(2.2-3*3)

----------------findall-----------------

-3.2

*3

----------------finditer----------------

(-3.2)

(22-3*3)

 

5.sub(pattern, repl, string, count=0, flags=0)

用于替换匹配的字符串

 

例6 替换2次

1

2

3

>>> ss='one,two,three'

print(re.sub('\w+','AAA',ss,2))

AAA,AAA,three

 

6.split(pattern, string, maxsplit=0, flags=0)

 

1

2

3

4

>>> a='i am ha happy man'

print(re.split('am',a))

-----------------

['i '' ha happy man']

 

除了上面的基本使用之外,还有几点需要注意。

 

*转移符\的使用,Python本身有转移符,在Re模块中也有转移符,因此,如果在Re里要匹配一个字符\,需要使用\\\\四次,首先Python转移为\\进入Re,然后Re再转义成\;一个简单的方法是使用原生字符r,这样\\就行了。

 

例7

1

2

3

4

5

6

>>> a=re.findall('\\\\','\sabc')

print(a)

b=re.findall(r'\\','\sjkll')

print(b)

['\\']

['\\']

 

正则里面还有有一个概念叫做分组。简单的说,分组就是在已经匹配获取的结果里面继续划分新的子集。

 

在search和match里面,group代表的是获取通过pattern匹配出来的结果;groups表示分组之后的结果;groupdic同样表示分组之后的结果,不过他需要通过P?指定名字才能显示出来

 

例8

1

2

3

4

5

6

7

8

9

import re

a=re.search('h(?P<name>\w+)','hello 123a hoo bc333')

print(a.group())

print(a.groups())

print(a.groupdict())

----------------

hello

('ello',)

{'name''ello'}

 

在findall里面分组比较特殊,如果有分组,那么他直接就显示出分组之后的子集,而不是匹配到的字符串

 

例9 首先匹配到['1hh','2kll']然后分组获取数字后面部分

1

2

3

4

>>> import re

a=re.findall('\d(\w+)','1hh jjkl2 hhs 2kll')

print(a)

['hh''kll']

 

sub就是替换,不存在分组

 

split的分组如下所示

 

例10,对比一下不分组和分组的差别,前者分割之后不会出现分隔符,后者会显示出来

1

2

3

4

5

6

7

>>> a='i am ha happy man'

print(re.split('am',a))

a='i am ha happy man'

print(re.split('(am)',a))

----------------

['i '' ha happy man']

['i ''am'' ha happy man']

 

最后补充一下,正则表达式的函数除了可以直接使用re.search, re.match等形式,还可以先编译一个pattern,然后通过pattern来调用这些函数

 

例11 先编译一次正则表达式,然后再通过编译后的pattern来调用,这样如果调用的地方很多,可以节省一下资源

1

2

3

4

5

6

7

>>> import re

>>> p=re.compile(r'\b\w+\b')

>>> match=p.search('jkl jkljl 23jk4 kjl2')

>>> print(match.group())

jkl

>>> p.findall('jkl kls 234lkjk23 23lk ')

['jkl''kls''234lkjk23''23lk']

 

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

 

本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1852180

© 著作权归作者所有

乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
她们不一样!python小白刚学会python竟然爬取了网上所有小姐姐的照片

如今想学python的人越来越多,无论是专业的程序员还是业余爱好者,都对python情有独钟。世界上值得学习的技能有很多,但是如果你要问我推荐哪一个,那么我会推荐一门编程语言,比如python。如...

Python学习
2018/06/06
0
0
Python爬虫入门,如何使用正则表达式

按照之前的课程安排,此次课程应该讲python基础第十六讲爬虫,但是如果正则一笔带过大家可能还是没办法写出自己想要实现的结果,所以把正则匹配详解提前学习一下,此次课程的学习路线会翻译官...

程序员补给栈
01/28
0
0
Python语言re模块学习笔记

Python通过re模块来使用正则表达式(regex)的思想。 re模块的match、search方法构造出匹配对象,match是匹配,search是查找,这个对象有group,groups方法。 re模块的findall、finditer方法...

红蜻蜓q
2018/05/11
0
0
python资料全集

python: 微信公众号开发小记——2.80端口上的服务 python: 微信公众号开发小记——3.接入三方登录 使用python编写一个壁纸网站的简单爬虫 python: python List 用法 Python 中各个时间复杂度...

d_watson
2016/04/15
175
0
Python第三章模块-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83580545 Python第三章模块—142人已学习 课程介绍 介绍Python在项目当中常用的...

安静的技术控
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Datatables插件1.10.15版本服务器处理模式ajax获取分页数据实例解析

一、问题描述 前端需要使用表格来展示数据,找了一些插件,最后确定使用dataTables组件来做。 后端的分页接口已经写好了,不能修改。接口需要传入页码(pageNumber)和页面显示数据条数(pageSi...

OSC首席混子
19分钟前
2
0
基于虹软的Android的人脸识别SDK使用测试

现在有很多人脸识别的技术我们可以拿来使用;但是个人认为还是离线端的SDK比较实用;所以个人一直在搜集人脸识别的SDK;原来使用开源的OpenCV;最近有个好友推荐虹软的ArcFace, 闲来无事就下...

是哇兴哥棒棒哒
29分钟前
0
0
Netty内存池之PoolThreadCache详解

PoolThreadCahche是Netty内存管理中能够实现高效内存申请和释放的一个重要原因,Netty会为每一个线程都维护一个PoolThreadCache对象,当进行内存申请时,首先会尝试从PoolThreadCache中申请,...

爱宝贝丶
42分钟前
16
0
除了Reader、Inbox之外 谷歌“关门部”还关闭了哪些服务或产品?

我们经常调侃称谷歌的“关门部”和微软的“更名部”是 IT 界的两大传奇,那么除了比较熟悉的 RSS 订阅服务 Google Reader、电子邮件服务 Inbox 和 Facebook 竞品 Google+ 之外,你还知道谷歌...

linux-tao
43分钟前
1
0
从B站的代码泄露事件中,我们能学到些什么?

先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要...

程序猿DD
47分钟前
54
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部