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实现简单拆分PDF文件的方法
Jul 30 Python
实例Python处理XML文件的方法
Aug 31 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
java中两个byte数组实现合并的示例
May 09 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
python代码xml转txt实例
Mar 10 Python
django中related_name的用法说明
May 20 Python
python不同系统中打开方法
Jun 23 Python
用python 绘制茎叶图和复合饼图
Feb 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中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
javascript 写类方式之二
2009/07/05 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
浅析Node.js查找字符串功能
2014/09/03 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
pycharm安装和首次使用教程
2018/08/27 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
解析python的局部变量和全局变量
2019/08/15 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
车贷收入证明范本
2014/01/09 职场文书
团员个人年度总结
2015/02/26 职场文书
第一书记观后感
2015/06/08 职场文书
余世维讲座观后感
2015/06/11 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书