python实现的正则表达式功能入门教程【经典】


Posted in Python onJune 05, 2017

本文讲述了python实现的正则表达式功能。分享给大家供大家参考,具体如下:

前文:

首先,什么叫正则表达式(Regular Expression)?

例如我们要判断字符串"adi_e32fv,Ls"里面是否含有子串"e32f",又例如我们在一个含百万个姓名的txt文件中找姓“王”,名字以“五”结尾的名字,然后打印出来。结果为:“王五”、“王小五”、“王大五”、“王小小五”……

以前我们是使用字符串函数来查找的,但是代码实现起来会很复杂。如今用正则表达式只需要一句 re.findall('王.*?五',txt1) 就可以了!正则表达式是写网络爬虫的最基本的知识,可以用正则表达式在html中搜集满足某些字串要求的网址。下面是个人对正则表达式基础知识的一些总结。

(操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)

正文:

1、首先要导入python的re模块。

2、元字符 . ^ $ * + ? {} [] \ | ()

re模块中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字符串'dit dot det,dct dit dot'中匹配'dit'结果为:

str1 = 'dit dot det,dct dit dot'
print re.findall('dit',str1)

结果:

['dit', 'dit']

|作用:'dit|dct'表示dit或者dct。

str1 = 'dit dot det,dct dit dot'
print re.findall('dit|dct',str1)

结果:

['dit', 'dct', 'dit']

[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:

str1 = 'dit dot det,dct dit dot'
print re.findall('d[ic]t',str1)

结果:

['dit', 'dct', 'dit']

^作用一:[^ic]中^表示否定,即除了i和c:

str1 = 'dit dot det,dct dit dot'
print re.findall('d[^ic]t',str1)

结果:

['dot', 'det', 'dot']

^作用二:^dit表示子串dit在开头位置,而dct不是在开头:

str1 = 'dit dot det,dct dit dot'
print re.findall('^dit',str1)
print re.findall('^dct',str1)

结果:

['dit'][]

$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:

str1 = 'dit dot det,dct dit dot'
print re.findall('dot$',str1)
print re.findall('dct$',str1)

结果:

['dot'][]

.作用:d.t表示d与t之间省略了一个任意字符:

str1 = 'dit dot det,dct dit dot'
print re.findall('d.t',str1)

结果:

['dit', 'dot', 'det', 'dct', 'dit', 'dot']

+作用:di+t表示d与t之间省略了一个或多个'i':

str1 = 'd dt dit diit det'
print re.findall('d.+t',str1)

结果:

['dit', 'diit']

*作用:di*t表示d与t之间省略了零个至多个'i':

str1 = 'd dt dit diit det'
print re.findall('d.*t',str1)

结果:

['dt', 'dit', 'diit']

经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:

str1 = 'd dt dit diit det'
print re.findall('d.+t',str1)
print re.findall('d.*t',str1)

结果:

['d dt dit diit det']['d dt dit diit det']

?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')

str1 = 'd dt dit diit det'
print re.findall('d.+?t',str1)

结果:

['dit', 'dot', 'det', 'dct', 'dit', 'dot']

?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:

str1 = 'd dt dit diit det'
print re.findall('di?t',str1)

结果:

['dt', 'dit']

{}作用一:di{n}t表示d和t之间有n个'i':

str1 = 'dt dit diit diiit diiiit'
print re.findall('di{2}t',str1)

结果:

['diit']

{}作用二:di{n,m}t表示d和t之间有n到m个'i':

str1 = 'dt dit diit diiit diiiit'
print re.findall('di{1,3}t',str1)

结果:

['dit', 'diit', 'diiit']

其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:

str1 = 'dt dit diit diiit diiiit'
print re.findall('di{1,}t',str1)
print re.findall('di{,3}t',str1)
print re.findall('di{,}t',str1)

结果:

['dit', 'diit', 'diiit', 'diiiit']
   ['dt', 'dit', 'diit', 'diiit']
   ['dt', 'dit', 'diit', 'diiit', 'diiiit']

\作用一:取消元字符,变成转义字符:

str1 = '^abc ^abc'
print re.findall('^abc',str1)
print re.findall('\^abc',str1)

结果:

[]['^abc', '^abc']

\作用二:预定义字符

str1 = '12 abc 345 efgh'
print re.findall('\d+',str1)
print re.findall('\w+',str1)

结果:

['12', '345']
   ['12', 'abc', '345', 'efgh']

()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:

str1 = '12abcd34'
print re.findall('12abcd34',str1)
print re.findall('1(2a)bcd34',str1)
print re.findall('1(2a)bc(d3)4',str1)

结果:

['12abcd34']
   ['2a']
   [('2a', 'd3')]

3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。

re.findall(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。

str1 = 'ab cd'
print re.findall('\w+',str1)

结果:['ab', 'cd']

re.finditer(pattern,string,flags = 0)

作用:其功能与re.findall相同,但结果以迭代器的形式返回。

str1 = 'ab cd'
iter1 = re.finditer('\w+',str1)
for a in iter1:
  print a.group(),a.span()

结果:

ab (0, 2)
      cd (3, 5)

(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)

re.search(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。

str1 = 'ab cd'
result = re.search('cd',str1)
if result == None:
  print 'None'
else:
  print result.group(),result.start(),result.end()

结果:cd 3 5

re.match(pattern,string,flags = 0)

作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。

str1 = 'ab cd'
result = re.match('cd',str1)
if result == None:
  print 'None'
else:
  print result.group(),result.start(),result.end()

结果:None

re.compile(pattern,flags = 0)

作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。

str1 = 'ab cd'
pre = re.compile('ab')
print pre.findall(str1)

结果:['ab']

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

作用:在string匹配pattern的时候做分割:

str1 = 'ab.c.de'
str2 = '12+34-56*78/90'
print re.split('\.',str1)
print re.split('[\+\-\*/]',str2)

结果:

['ab', 'c', 'de']
      ['12', '34', '56', '78', '90']

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

作用:在string当中把满足pattern正则的字串替换成repl:

str1 = 'abcde'
print re.sub('bc','123',str1)

结果:a123de

re.subn(pattern,repl,string,count = 0,flags = 0)

作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次

str1 = 'abcdebce'
print re.subn('bc','123',str1)

结果:('a123de123e', 2)

Python 相关文章推荐
python实现的解析crontab配置文件代码
Jun 30 Python
Python判断操作系统类型代码分享
Nov 22 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python整型运算之布尔型、标准整型、长整型操作示例
Jul 21 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
Python实现读取json文件到excel表
Nov 18 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
OpenCV 模板匹配
Jul 10 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
用Python制作音乐海报
Jan 26 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 #Python
详解Python pygame安装过程笔记
Jun 05 #Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 #Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 #Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 #Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 #Python
Python实现选择排序
Jun 04 #Python
You might like
php实现把数组按指定的个数分隔
2014/02/17 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
简单的分页代码js实现
2016/05/17 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
pandas数据处理进阶详解
2019/10/11 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
公司年会演讲稿范文
2014/01/11 职场文书
甜点店创业计划书
2014/01/27 职场文书
汉语言文学职业规划
2014/02/14 职场文书
员工安全生产承诺书
2014/05/22 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
银行求职自荐信范文
2015/03/04 职场文书
小学工作总结2015
2015/05/04 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
Java Socket实现多人聊天系统
2021/07/15 Java/Android
【2·13】一图读懂中国无线电发展
2022/02/18 无线电