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中的条件判断语句基础学习教程
Feb 07 Python
使用numba对Python运算加速的方法
Oct 15 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
Python列表切片常用操作实例解析
Mar 10 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
解决Python字典查找报Keyerror的问题
May 26 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php中explode与split的区别介绍
2012/10/03 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
JQuery验证工具类搜集整理
2013/01/16 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Puppet的一些技巧
2018/09/17 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
Python读取Excel的方法实例分析
2015/07/11 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
详解python中的模块及包导入
2019/08/30 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
采购主管工作职责
2013/12/12 职场文书
政审证明材料
2015/06/19 职场文书
神秘岛读书笔记
2015/07/01 职场文书
实习报告怎么写
2019/06/20 职场文书
Oracle中日期的使用方法实例
2022/07/07 Oracle