定义

        正则表达式提供了功能强大、灵活又高效的方法来处理文本:快速分析大量文 本以找到特定的字符模式;提取、编辑、替换或删除文本字符串;将提取的字 符串添加到集合以生成报告。正则表达式广泛用于各种字符串处理应用程序, 如 HTML 处理、日志文件分析等。 在进行文本字符串处理时经常需要查找符合某些复杂规则的字符串,正则表达 式就是用于描述这些规则的语言,可以匹配和查找字符串,并对其进行相应的 修改处理。
        正则表达式(Regular Expression )是一段字符串,它可以表示一段有规律的 信息,主要由普通字符 ( 例如:字符 a 到 z) 以及特殊字符(称为元字符)组成的 文字模式,元字符包括: . 、 ^ 、 $ 、 * 、 + 、 ? 、 { 、 } 、 [ 、 ] 、 \ 、 | 、 ( 、 ) 。

普通字符和转义字符

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学习笔记(五)——正则表达式相关推荐

  1. Python学习笔记五:控制语句

    Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...

  2. Python学习笔记:正则表达式

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记(五)—LOOP 循环

    个人认为Python基础学习直到LOOP才算真正开始. 循环有While, do-while, 和for() 比如while 我们要输出100条"you are my sunshine &q ...

  4. 【懒懒的Python学习笔记五】

    在这一章中,你将学习到能够将信息关联起来的Python字典,将学习如何访问和修改字典中的信息,同时也会学习如何遍历字典中的数据. 一.一个简单的字典 新建了一个存储用户信息的字典,里面存储了用户姓名. ...

  5. Python学习笔记五:条件循环

    文章目录 一.再谈print和import 1. 打印多个参数 2. 导入时重命名 二.赋值魔法 1. 序列解包 2. 链式赋值 3. 增强赋值 三.代码块:缩进的乐趣 四.条件和条件语句 1. 这正 ...

  6. Python学习笔记五--条件和循环

    5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...

  7. Python学习笔记(正则表达式)

    \b - 表示以什么开头或结尾 \d - 匹配数字 \w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以) \s - 匹配任意的空白符 ^ - 匹配字符串 ...

  8. Python学习笔记 - 探索正则表达式标志匹配

    大家好,我是Mr数据杨,今天我们要一起探索正则表达式re的功能.就像在<三国演义>中,谋士们如何运用智谋指挥千军万马,我们也可以用re功能指挥文字舞动. 正则表达式可以帮助我们匹配不区分大 ...

  9. Python学习笔记 - 探索正则表达式re功能

    大家好,我是Mr数据杨.今天让我们踏上一次寻宝之旅,我们的宝藏是正则表达式re的功能,先来看re的搜索功能.这个功能就像我们的郭嘉,他的智谋就像re的搜索功能,能在无数的信息中找到那个关键点.他预测天 ...

  10. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. Go 知识点(19)— Go 语言中的野指针
  2. 在C++中对字符串std::string使用switch/case语句
  3. Scala中集合类型与java中集合类型转换
  4. 2019.03.21 增删改
  5. 左右居中_008布局题:div垂直居中,左右10px,高度始终为宽度一半
  6. 深度学习笔记 第五门课 序列模型 第三周 序列模型和注意力机制
  7. 判断一个程序员水平高低的标准?
  8. python封装api给vue_Vue axios api统一管理的封装
  9. spring boot shiro redis整合基于角色和权限的安全管理-Java编程
  10. 消息称快手已通过港交所聆讯 计划2月第一周上市
  11. JSK-7 奇怪的国家【入门】
  12. C语言购物管理系统项目
  13. 单片机胡汉才第四版答案_单片机课后习题答案--胡汉才编
  14. 基于单片机的GPS开发 (four) GPS基础知识
  15. Android事件分发机制
  16. 商场管理系统原创代码
  17. Jquery Jqprint—借助Jquery Jqprint实现网页打印功能
  18. 摩托梁念坚出任微软大中华区董事长兼CEO
  19. C语言编程>第二十二周 ② 请补充fun函数,该函数的功能是:返回字符数组中指定字符的个数,指定字符从键盘输入。
  20. 实时可视化大数据项目02 -- 项目目录介绍

热门文章

  1. Mysql数据库(六)计算总数
  2. 光脚丫思考Vue3与实战:第02章 安装Vue.js
  3. smtplib.SMTPAuthenticationError (535, b‘5.7.0 ERR.LOGIN.NONSSL‘)
  4. EPC附着及IMS PDN建立过程
  5. cookie expires和max-age的区别
  6. 程序员每天晚上都去翻垃圾,竟然年入 60 万美元?
  7. 戴眼镜会需要眼镜盒,该怎么创建眼镜盒嗯?下面我们就来看看3dmax创建眼镜盒模型的技巧。
  8. 逆变器的输出外特性分析
  9. 写一篇以名字叫御坂网络20002的魅魔为主角打败女勇者的小说
  10. 欧几里德算法及其扩展算法