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实现端口复用实例代码
Jul 03 Python
python使用marshal模块序列化实例
Sep 25 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
Apr 08 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 读取文件乱码问题
2010/02/20 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
php实用代码片段整理
2016/11/12 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
PHP7 windows支持
2021/03/09 PHP
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
javascript实现简易计算器功能
2020/09/23 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
python实现求特征选择的信息增益
2018/12/18 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
基于python操作ES实例详解
2019/11/16 Python
python读取ini配置文件过程示范
2019/12/23 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
ORACLE第二个十问
2013/12/14 面试题
座谈会主持词
2014/03/20 职场文书
个人委托函范文
2015/01/29 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技