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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python创建临时文件夹的方法
Jul 06 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
python实战教程之自动扫雷
Jul 13 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
Jun 13 Python
Python Django的安装配置教程图文详解
Jul 17 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
Python接口自动化判断元素原理解析
Feb 24 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP学习笔记之一
2011/01/17 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
如何提高数据访问速度
2016/12/26 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
python 文件操作api(文件操作函数)
2016/08/28 Python
python 定时修改数据库的示例代码
2018/04/08 Python
python实现推箱子游戏
2020/03/25 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python图片的横坐标汉字实例
2019/12/04 Python
iPython pylab模式启动方式
2020/04/24 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
个人查摆剖析材料
2014/02/04 职场文书
低碳环保口号
2014/06/12 职场文书
球队口号
2014/06/18 职场文书
react 路由Link配置详解
2021/11/11 Javascript
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
Redis基本数据类型List常用操作命令
2022/06/01 Redis