Python高手之路【五】python基础之正则表达式
下图列出了Python支持的正则表达式元字符和语法:
字符点:匹配任意一个字符
import re
st = 'python'
result = re.findall('p.t',st)
print(result)
字符^:匹配以什么开头
import re
st = 'python'
result = re.findall('^py',st)
print(result)
字符$:匹配以什么结尾
import re
st = 'python'
result = re.findall('n$',st)
print(result)
字符*:匹配任意次,包括0次
import re
st = 'I looooooove python'
result = re.findall('lo*ve',st)#字符0可以没有,也可以无限多个,都可以匹配
print(result)
字符+:匹配一次或多次
import re
st = 'I looooooove python'
result = re.findall('lo+ve',st)#字符0没有就匹配不上
print(result)
字符?:匹配0次或一次
import re
st = 'I love python'
result = re.findall('lo?ve',st)#字符0没有也能匹配
print(result)
{m}:匹配前一个字符的m次
import re
st = 'I loooove python'
result = re.findall('o{3}',st)#匹配3个o字符
print(result)
{m,n}:匹配前一个字符的m-n次
import re
st = 'I loooove python'
result = re.findall('lo{1,4}ve',st)
print(result)
[abc]或[a-c]:匹配[]中的任意一个字符
import re
st = 'I loooove python'
result = re.findall('l[0-z]*e',st)
print(result)
[a|b]:匹配字符a或字符b
import re
st = 'I lbve python'
result = re.findall('l[a|b]ve',st)
print(result)
[^1-9]:[]里出现^字符,表示非的意思,并不表示以什么开头的意思
import re
st = 'I lb2ve python6'
result = re.findall('[^0-9]',st)
print(result)
##########################################
['I', ' ', 'l', 'b', 'v', 'e', ' ', 'p', 'y', 't', 'h', 'o', 'n']
\:
- 反斜杠后边跟元字符去除特殊功能
- 反斜杠后边跟普通字符实现特殊功能
- 引用序号对应的字组所匹配的字符串
数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。
import re
result = re.findall(r'ab*','abbbc')
print(result)
##########################################
['abbb']
import re
result = re.findall(r'ab*?','abbbc')#取消贪婪模式
print(result)
##########################################
['a']
re.match() 从头匹配
import re
origin = "hello poe bcd jet who are you 20"
r = re.match("h\w+",origin)
print(r.group()) #获取匹配到的所有结果
print(r.groups()) #获取模型中匹配到的分组结果
print(r.groupdict()) #获取模型中匹配到的分组结果
##########################################
hello
()
{}
r = re.match("(h)(\w+)",origin)
print(r.group()) #获取匹配到的所有结果
print(r.groups()) #获取模型中匹配到的分组结果
print(r.groupdict()) #获取模型中匹配到的分组结果
##########################################
hello
('h', 'ello')
{}
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group()) #获取匹配到的所有结果
print(r.groups()) #获取模型中匹配到的分组结果
print(r.groupdict()) #获取模型中匹配到的分组结果
##########################################
hello
('h', 'ello')
{'n2': 'ello', 'n1': 'h'}
re.search() 浏览全部字符串,匹配第一个符合规则的字符串
与re.match()用法基本一样
import re
origin = "hello poe bcd jet poe who are you 20"
r = re.search("p(\w+).*(?P<name>\d)$",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group()) #获取匹配到的所有结果
print(r.groups()) #获取模型中匹配到的分组结果
print(r.groupdict()) #获取模型中匹配到的分组结果
##########################################
poe bcd jet poe who are you 20
('oe', '')
{'name': ''}
re.findall() 将匹配的所有内容都放置在一个列表中
注:此方法空匹配也会保存到结果中,如:
result = re.findall("","a2b3c4d5")
print(result)
print(len(result))
##########################################
['', '', '', '', '', '', '', '', '']
re.findall()方法要注意有分组的情况:
#没有分组的情况
r = re.findall("p\w+",origin)
print(r)
##########################################
['poe', 'poe']
#有分组的情况,会把匹配到的分组放到结果列表中
r = re.findall("p(\w+)",origin)
print(r)
##########################################
['oe', 'oe']
re.finditer()
import re
origin = "hello poe bcd jet poe who are you 20"
r = re.finditer("(p)(\w+(e))",origin)
for i in r :
print(i.group())
print(i.groups())
print(i.groupdict())
re.split()
无分组情况,匹配到的字符串不会出现在匹配结果中:
import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a\w+",origin,1)
print(r)
##########################################
['hello poe bcd jet poe who ', ' you 20']
有分组情况,匹配到的分组字符串也会出现在匹配结果中:
import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a(\w+)",origin,1)
print(r)
##########################################
['hello poe bcd jet poe who ', 're', ' you 20']
re.sub() 正则替换
import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str = re.sub("\d+","KKK",origin,1)#参数1表示只替换匹配到的第一个字符串,如果是2表示替换匹配到的前2个字符串
print(new_str)
##########################################
KKKyiuoosfdKKKkuiuadf789v,xznfa978
re.subn()只是比re.sub()多返回一个数据,如:
import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str,count = re.subn("\d+","KKK",origin)#参数1表示只替换匹配到的第一个字符串
print(new_str,count)
##########################################
KKKyiuoosfdKKKkuiuadfKKKv,xznfaKKK 4
这个4表示替换匹配了4次
Python高手之路【五】python基础之正则表达式的更多相关文章
- Python高手之路 ------读书有感
最近忙中偷闲把前些年买的<Python高手之路>翻了出来,大致看完了一遍,其中很多内容并不理解,究其原因应该是实践中的经验不足,而这对于现如今的我仍是难以克服的事情,对此也就只能说是看会了 ...
- 《Python高手之路 第3版》这不是一本常规意义上Python的入门书!!
<Python高手之路 第3版>|免费下载地址 作者简介 · · · · · · Julien Danjou 具有12年从业经验的自由软件黑客.拥有多个开源社区的不同身份:Debian开 ...
- python开发之路:python数据类型(老王版)
python开发之路:python数据类型 你辞职当了某类似微博的社交网站的底层python开发主管,官还算高. 一次老板让你编写一个登陆的程序.咔嚓,编出来了.执行一看,我的妈,报错? 这次你又让媳 ...
- Python高手之路【七】python基础之模块
本节大纲 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparse ...
- Python菜鸟之路:Python基础-模块
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,分组的规则就是把实现了某个 ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 我的Python成长之路---第六天---Python基础(18)---2016年2月20日(晴)
os模块 提供对操作系统进行调用的接口 >>> import os >>> os.getcwd() # 获取当前工作目录,类似linux的pwd命令 '/data/ ...
- python学习之路-1 python简介及安装方法
python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...
- JVM菜鸟进阶高手之路十(基础知识开场白)
转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
随机推荐
- 用php做注册审核
做注册审核就像前面讲的注册登录一样,也是要连接数据库 首先在数据库内要做这样一张表: 表名为users表 里面的列名分别为用户名,密码,姓名,性别,生日,账户的状态,照片 然后就可以写代码了,要注册的 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- JS实现页面进入、返回定位到具体位置
最为一个刚入职不久的小白...慢慢磨练吧... JS实现页面返回定位到具体位置 其实浏览器也自带了返回的功能,也就是说,自带了返回定位的功能.正常的跳转,返回确实可以定位,但是有些特殊场景就不适用了. ...
- 【NLP】前戏:一起走进条件随机场(一)
前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...
- 编译器开发系列--Ocelot语言6.静态类型检查
关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...
- Linux实战教学笔记03:操作系统发展历程及系统版本选择
标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...
- vs生成pro
1.修改.vcxproj文件 <PropertyGroup Label="Globals"> <ProjectGuid>{AAAA4039-13B ...
- maven常见异常以及解决方法
本文写的是我在整合ssm框架时遇到的一些问题,我估计很多人也会遇到,所以,这里作为一个总结,希望能够帮助大家解决问题 一,加入shiro组件时抛出的异常 加入步骤(略) 问题 1,保存后,无法导入sh ...
- 基于AngularJs的上传控件-angular-file-upload
今天跟大家分享的是一个依赖于angular的上传控件. 前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用 ...
- 兼容Mono的下一代云环境Web开发框架ASP.NET vNext
微软在2014年5月12日的TechEd大会上宣布将会发布下一代ASP.NET框架ASP.NET vNext的预览.此次发布的ASP.NET框架与以前相比发生了根本性的变化,凸显了微软“云优先”(cl ...