Python学习笔记(五)——正则表达式
定义
普通字符和转义字符
import re
str="dasuih1213"
print(re.search("sui",str))
print(re.search("h.*1",str))
根据正则表达式有关用法,此处使用search函数搜索对应的字符串,假如不是用元字符,则可以精确搜索字符串中是否有指定的元素,假如使用了元字符,则可以模糊查找对应的字符串,比如上述代码,首先精确查找了sui,输出结果显示对应第2到第5位查找到了相关字符串。然后使用了模糊查找,使用了元字符*和.,其中.可以指代任何一个字符(换行符除外),*可以匹配上一个之前的字符任意次(0次或者更多次数)。查找显示span位于第五位到第九位对应的字符串为h121可以匹配所对应的字符串。这一点十分方便。可以实现模糊搜索,只需要声明起始还有终止时的字符串即可。
点号.
点号可以代替包括但不限于英文字母、数字、汉字、英文标点符号以及中文标点符号。
import re
str2='山东大学是个好学校'
print(re.search('大学.*',str2))
上述字符串中对于中文字符实现了模糊查找,说明正则表达式对于中文也是使用的。
星号*
一个星号可以表示它前面的一个子表达式(可以是普通字符、另一个或者是几个正则表达式符号)0次到无限次。
问号?
问号表示他前面的子表达式0次或者1次。注意这里的问号是英文问号(?)
举个例子
import re
case='山大是985、211工程啊啊啊啊啊啊啊'
print(re.search("211工程啊?",case))
由于使用了中文问号,此处显示查找的结果为空。说明必须使用英文问号。
import re
case='山大是985、211工程啊啊啊啊啊啊啊'
print(re.search("211工程啊?",case))
上述代码改为了英文问号。结果如下图所示。
反斜杠“\”转义
反斜杠在正则表达式里面不能单独使用。需要与其他字符配合使用把特殊符号转变成普通符号,把普通符号转变成特殊符号。
转义字符 | 描述 |
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | backspace |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
原始字符串的表示
需要说明的一点是,当在字符串开头加上字符r或者R,则表示原始字符串,不进行任何转义。
(使用r或者R来避免反斜杠被转义成其他字符。)
正则表达式字符之间的区分(.*与.*?)
.*表示任意长度字符串任意次,必须在.*的前后加上其他字符来限定范围,否则得到的结果就是整个字符串。
.*?可以匹配一个满足要求的最短的字符串。
举个实例:
使用.*
import re
str='我是一个大好人啊啊啊啊啊啊啊啊啊啊啊啊'
print(re.search('大好人啊.*',str))
str2='我是一个大好人啊啊啊啊啊啊'
print(re.search('大好人啊.*',str2))
使用.*?
import re
str='我是一个大好人啊啊啊啊啊啊啊啊啊啊啊啊'
print(re.search('大好人啊.*?',str))
str2='我是一个大好人啊啊啊啊啊啊'
print(re.search('大好人啊.*?',str2))
匹配的始终是最短的字符串。
数字“\d”
正则表达式里使用“\d”表示一位数字,系统将\d看作一个整体。
比如
import re
str='高等数学我的考试成绩为98分'
print(re.search('成绩为\d',str))
可以看出,\d仅能代表一位数字。故输出结果为9,而没有后面的8.需要与*结合使用。
结合使用之后
import re
str='高等数学我的考试成绩为98分'
print(re.search('成绩为\d*',str))
小括号‘()’
小括号可以把括号里内容提取出来。
import re
str='你的账号密码密码我知道,是:123123,嘿嘿。'
print(re.search(",是:(.*?),",str))
这里的标点符号使用的是英文,结果导致结果出错。所以在使用正则表达式时一定要特别注意大小写问题,编辑器对于大小写尤为敏感。
更正后再次使用正则表达式
import re
str='你的账号密码密码我知道,是:123123,嘿嘿。'
print(re.search(",是:(.*?),",str))
字符类
字符类是有一对方括号[]括起来的字符集合,正则表达式会匹配字符集中的任意一个字符。
例子详解
枚举字符集 [s,f,v,a]:可以匹配其中的任意一个字符
t[a,e,f,r,y]n:可以匹配tan,ten,tfn,trn,tyn
[^x,t,e]:否定枚举字符集:匹配不在括号里面的任意字符。
[a-z]:指定范围内的字符,可以匹配指定范围内的任意字符。
[^a-z]:指定范围外的任意字符,也就是除去括号范围内的任意字符。
代码案例
import re
str='你的真的假的账号密码密码我知道,是:123123,真的假滴嘿嘿。'
print(re.findall('真的假[的,滴]',str))
正则表达式里面有若干预定义类
正则表达式模块re
方法 | 作用 |
match() | 从头开始匹配 |
search() | 扫描全文中并匹配第一个元素 |
findall() | 匹配所有元素 |
sub() | 替换操作 |
match方法
基本格式
re.match(pattern,string[,flags])
其中pattern表示正则表达式
string表示原来字符串
flags表示一些特殊功能的标志。
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
实例
import re
print(re.match(r'woshigedahaoren','woshigedahaoren'))
从头到尾完全匹配,则匹配成功。
import re
print(re.match(r'woshigedahaoren','wdahaoren'))
从头到尾未完全匹配,匹配失败。
转义匹配
当用到正则匹配模式的特殊字符时,在前面加上反斜杠转义一下即可。例如.可以用\.来匹配。
import re
content='www.baidu.com'
result=re.match('www\.baidu\.com',content)
print(result)
search方法
search方法只会返回第一个满足要求的字符串。一旦找到符合要求的内容。他就会停止查找(他别适合在大的文本文件中查找第一个数据)大大提高程序的运行效率。
函数原型
re.search(pattern,string,[flags=0])
pattern表示正则表达式
string表示原来字符串
flags表示一些特殊功能标志
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
举个例子
import re
content='我的博客账号是:团团带你学代码,密码是:123123。我的新浪微博账号是:团团带你学代码,密码是:123123。'
print(re.search('密码是:(.*?)。',content))
匹配目标
正则表达式对象的match方法和search方法在匹配成功后会返回match对象,需要调用group()方法返回匹配的一个或者多个子模式的内容。
假如想从字符串中提取一部分内容,可以使用()括号将代替提取的子字符串括起来,()实际标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用group()方法传入分组的索引即可获取提取的结果。
group()方法主要有:
match_obj.group():返回整个匹配内容。
match_obj.group(i):返回第i个匹配内容。
match_obj.group(i,j):返回第i,j个匹配内容。
例子
import re
content='我的微博账号是:asa,密码是:123,QQ账号是:www,密码是9876'
result=re.search('账号是:(.*?),密码是:(.*?),',content)
print(result)
上述情况输出的是全部的子模式内容。假如更换条件,仍然可以返回其他子模式内容。
import re
content='我的微博账号是:asa,密码是:123,QQ账号是:www,密码是9876'
result=re.search('账号是:(.*?),密码是:(.*?),',content)
print(result.group(1))
上述式子返回的是第一个子模式内容,将group(1)改成group(2)则是返回第二个子模式内容。
findall方法
能够以列表的形式返回所有满足要求的字符串。
re.findall(pattern,string,flags=0)
pattern表示正则表达式
string表示原来的字符串
flags表示一些特殊功能的标志
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
findall返回的是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表。
import re
content='我的微博密码是:asa,微信密码是:123,QQ密码是:9876,阿萨'
password_list=re.findall(':(.*?),',content)
print(password_list)
返回的仍然是一个列表,但是列表里面的元素变成了元组。
re库中不同方法比较
match()方法 |
从字符串开头开始匹配,一旦开头不匹配,则整个匹配失败。 更适合用于检测某个字符串是否符合某个正则表达式的规则。 |
search()方法 |
依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,否则失败。 主要用于查询一次性结果 |
findall()方法 |
依次扫描字符串,知道找到所有符合规则的字符串列表,然后返回匹配内容,否则失败。 主要用于查询所有结果 |
sub方法
re.sub(pattern,repl,string[,count])
用于替换.
当repl是字符串,则使用repl替换字符串每个匹配的子串并返回替换后的字符串,如果repl是函数,则该方法应当只接受一个参数并返回一个字符串用于替换。
string代表原来的字符串,不指定时全部替换。
import re
a='adsh 2022-2004 salfhfihvgs'
s=re.sub('\d{4}','hello welcome',a )
print(s)
re库的等价用法
函数式用法:
一次性操作。
import re
res=re.search(r'[1-9]\d{5}','bit 100081')
print(res)
面向对象用法:
编译后的多次操作。
import re
pattern=re.compile(r'[1-9]\d{5}')
rst=pattern.search('BIT 100081')
print(rst)
函数式用法使用完继续使用时还需要继续写代码。而使用面向对象用法用完之后还能继续使用。
complie方法
pattern:将正则表达式的字符串或者原生字符串表示出来
flags:正则表达式使用时的实时标记。
匹配算法
贪婪匹配算法
.*表示任意长度字符串任意次,必须在.*的前后加上其他字符来限定范围,否则得到的结果就是整个字符串。
.*?可以匹配一个满足要求的最短的字符串。
re库默认使用的时贪婪匹配,即输出匹配最长的字符串。
非贪婪匹配算法
在重复限定符后面加上后缀“ ?”,则正则表达式会使用懒惰型匹配算法。
举个例子
import re
match=re.search(r'py.*n','pyanbncndn')
print(match.group())
match2=re.search(r'py.*?n','pyanbncndn')
print(match2.group())
选择分支
正则表达式中‘|’表示选择,用于选择匹配多个可能的正则表达式中的某一个。
import re
print(re.findall(r"((0\d{2}|\d{3})-(\d{8}|d{6}))","电话号码012-45214523"))
传送门:Python全套学习笔记
Python学习笔记(五)——正则表达式相关推荐
- Python学习笔记五:控制语句
Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...
- Python学习笔记:正则表达式
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记(五)—LOOP 循环
个人认为Python基础学习直到LOOP才算真正开始. 循环有While, do-while, 和for() 比如while 我们要输出100条"you are my sunshine &q ...
- 【懒懒的Python学习笔记五】
在这一章中,你将学习到能够将信息关联起来的Python字典,将学习如何访问和修改字典中的信息,同时也会学习如何遍历字典中的数据. 一.一个简单的字典 新建了一个存储用户信息的字典,里面存储了用户姓名. ...
- Python学习笔记五:条件循环
文章目录 一.再谈print和import 1. 打印多个参数 2. 导入时重命名 二.赋值魔法 1. 序列解包 2. 链式赋值 3. 增强赋值 三.代码块:缩进的乐趣 四.条件和条件语句 1. 这正 ...
- Python学习笔记五--条件和循环
5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...
- Python学习笔记(正则表达式)
\b - 表示以什么开头或结尾 \d - 匹配数字 \w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以) \s - 匹配任意的空白符 ^ - 匹配字符串 ...
- Python学习笔记 - 探索正则表达式标志匹配
大家好,我是Mr数据杨,今天我们要一起探索正则表达式re的功能.就像在<三国演义>中,谋士们如何运用智谋指挥千军万马,我们也可以用re功能指挥文字舞动. 正则表达式可以帮助我们匹配不区分大 ...
- Python学习笔记 - 探索正则表达式re功能
大家好,我是Mr数据杨.今天让我们踏上一次寻宝之旅,我们的宝藏是正则表达式re的功能,先来看re的搜索功能.这个功能就像我们的郭嘉,他的智谋就像re的搜索功能,能在无数的信息中找到那个关键点.他预测天 ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
最新文章
- Go 知识点(19)— Go 语言中的野指针
- 在C++中对字符串std::string使用switch/case语句
- Scala中集合类型与java中集合类型转换
- 2019.03.21 增删改
- 左右居中_008布局题:div垂直居中,左右10px,高度始终为宽度一半
- 深度学习笔记 第五门课 序列模型 第三周 序列模型和注意力机制
- 判断一个程序员水平高低的标准?
- python封装api给vue_Vue axios api统一管理的封装
- spring boot shiro redis整合基于角色和权限的安全管理-Java编程
- 消息称快手已通过港交所聆讯 计划2月第一周上市
- JSK-7 奇怪的国家【入门】
- C语言购物管理系统项目
- 单片机胡汉才第四版答案_单片机课后习题答案--胡汉才编
- 基于单片机的GPS开发 (four) GPS基础知识
- Android事件分发机制
- 商场管理系统原创代码
- Jquery Jqprint—借助Jquery Jqprint实现网页打印功能
- 摩托梁念坚出任微软大中华区董事长兼CEO
- C语言编程>第二十二周 ② 请补充fun函数,该函数的功能是:返回字符数组中指定字符的个数,指定字符从键盘输入。
- 实时可视化大数据项目02 -- 项目目录介绍
热门文章
- Mysql数据库(六)计算总数
- 光脚丫思考Vue3与实战:第02章 安装Vue.js
- smtplib.SMTPAuthenticationError (535, b‘5.7.0 ERR.LOGIN.NONSSL‘)
- EPC附着及IMS PDN建立过程
- cookie expires和max-age的区别
- 程序员每天晚上都去翻垃圾,竟然年入 60 万美元?
- 戴眼镜会需要眼镜盒,该怎么创建眼镜盒嗯?下面我们就来看看3dmax创建眼镜盒模型的技巧。
- 逆变器的输出外特性分析
- 写一篇以名字叫御坂网络20002的魅魔为主角打败女勇者的小说
- 欧几里德算法及其扩展算法