一、认识正则表达式

1. 什么是正则表达式 - 一种可以让复杂的字符串问题变得简单的工具

1)案例1: 判断输入的内容是否是一个合法的手机号码
要求: a. 长度11位 b.全部都是数字字符 c.第一位是1 d. 第二位:3~9

tel = ‘783243822’

方法1:不使用正则

if len(tel)  == 11:if tel[0]  == '1' and tel[1] in '3456789':flag = Truefor x in tel[2:]:if not '0' <= x <= '9':flag = Falsebreakif flag:print('合法')else:print('不合法')else:print('不合法')
else:print('不合法')

方法2:使用正则表达式

from re import fullmatch
result = fullmatch(r'1[3-9]\d{9}', tel)
if result:print('合法')
else:print('不合法')

2)案例2: 提取字符串中所有的数字字串
message = ‘年龄:18岁, 身高:179, 体重:120斤, 月薪:3000元, 房租:1000元’
[‘18’, ‘170’, ‘120’, ‘3000’, ‘1000’]

方法1: 不使用正则

result = []
str1 = ''
for x in message:if '0' <= x <= '9':str1 += xelse:if str1:result.append(str1)str1 = ''
if str1:result.append(str1)
print(result)

方法2:使用正则

from re import findall
result = findall(r'\d+', message)    #\d+ 连续出现的数字
print(result)

二、匹配类符号

from re import fullmatch

1. fullmatch函数

fullmatch(正则表达式, 字符串) - 判断字符串是否满足正则表达式描述的规则,如果不满足,结果就是None
不管使用正则表达式解决什么样的字符串问题,写正则的时候都是在描述字符串规则

2. 所有匹配类符号

1) 普通符号 - 在正则表达式中表示本身的字符就是普通符号

result = fullmatch(r'abc','abc')
print(result)

2) . - 匹配任意一个字符

result = fullmatch(r'.bc', '8bc')
print(result)result = fullmatch(r'a..','a你好')
print(result)

3) \d - 匹配任意一个数字字符

result = fullmatch(r'a\d\db', 'a72b')
print(result)

4) \s - 匹配任意一个空白字符

空白字符 - 所有能产生空白效果的字符:空格、\t、\n

result = fullmatch('a\sb', 'a b')
print(result)

5) \w - 匹配任意一个数字、字母、下划线或者中文

result = fullmatch(r'a\wb', 'a_b')
print(result)

6) \D、\S、\W

\后面跟大写字母对应的功能和\后面跟小写字母的功能相反
\D - 匹配任意一个非数字字符

result = fullmatch(r'a\Db\Sc\We', 'a你b好c?e')
print(result)

7) [字符集] - 匹配在字符集中的任意一个字符

[amx] - 匹配a、m、x中的任意一个
[\dmn] - (\开头的特殊符号在中括号中还是有特殊意义)匹配任意一个数字或者m或者n
[3-9mn] - (-在中括号中表示谁到谁)匹配3到9中的任意一个数字或者m或者n
[a-z] - 匹配任意一个小写字母
[A-z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[\u4e00-\u9fa5] - 匹配任意一个中文

result = fullmatch(r'a[xyz]b', 'axb')
print(result)result = fullmatch(r'a[ma\d]b','amb')
print(result)result = fullmatch(r'a[\u4e00-\u9fa5A-Z]b', 'a中b')
print(result)

-注意:中括号中的-只有放在两个字符之间才能表示谁到谁,
如果放在中括号的最前面或者最后面,或者放在中括号外面减号就只表示减号本身

8) [字符集] - 匹配不在字符集中的任意一个字符

result = fullmatch(r'a[^A-Z]b', 'a4b')
print(result)result = fullmatch(r'a[^mn]b', 'a9b')
print(result)

-注意:[ ]里面的^, 只有放在最前面才有特殊功能,如果不再最前面^就是普通符号

result = fullmatch(r'a[s^A-Z]b','aMb')
print(result)

三、匹配次数相关符号

from re import fullmatch, match

1. * - 0次或者多次(任意多次)

匹配类符号*

print(fullmatch(r'a*b','aaaab'))
print(fullmatch(r'\d*b','336547b'))
print(fullmatch(r'.*b','Kw$%3Kb'))
print(fullmatch(r'[A-Z]*b','KSOAKb'))

2. + - 1次或者多次

print(fullmatch(r'a+b','aaaab'))

3. ? - 0次或者1次

print(fullmatch(r'a?b', 'ab'))

4. {} - 控制次数

{N} - N次
{N,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次

print(fullmatch(r'a{3}b','aaab'))
print(fullmatch(r'a{3,5}b','aaaab'))
print(fullmatch(r'a{3,}b','aaaaaaab'))   # >= 3次
print(fullmatch(r'a{,3}b','aab'))     # <= 3次

5. 贪婪和非贪婪

匹配次数不确定的时候匹配模式分为贪婪和非贪婪两种,默认是贪婪的。

  • 贪婪:在能匹配成功的情况下,有多种匹配次数,贪婪取次数最多的那个次数。(+、*、?、{M,N}、{M,}、{,N})
  • 非贪婪:在能匹配成功的情况下,有多种匹配次数,非贪婪取次数最少的那个次数 (+?、*?、??、{M,N}?、{M,}?、{,N}?)

fullmatch(正则表达式,字符串) - 匹配整个字符串
match(正则表达式,字符串) - 匹配字符串开头

print(match(r'a\db', 'a3b是多少发多少'))

‘a1b’、‘a1b就是b’、‘a1b就是b设b’

print(match(r'a.+b', 'a1b就是b设b计师'))      # <re.Match object; span=(0, 8), match='a1b就是b设b'>
print(match(r'a.+?b', 'a1b就是b设b计师'))     # <re.Match object; span=(0, 3), match='a1b'>print(match(r'a.+b', 'a12b就是设计师'))       # <re.Match object; span=(0, 4), match='a12b'>
print(match(r'a.+?b', 'a12b就是设计师'))      # <re.Match object; span=(0, 4), match='a12b'>

练习:写正则表达式可以匹配任意一个整数字符串(不考虑0)
匹配成功:‘123’、‘9’、‘-234’、‘+233’
匹配失败:‘23m’、‘–7283’、‘++782’、‘009’、‘02’

print(fullmatch(r'[+-]?[1-9]\d*','009'))

四、分组和分支

from re import fullmatch

1.( ) - 分组

在正则表达式中可以用()将正则表达式中的部分内容括起来表示一个整体,一个()代表一个分组。

1) 以某个部分为单位对符号进行控制(整体控制)

‘mn123kl234hg0992mn123’

print(fullmatch(r'([a-z]{2}\d{3})+', 'mn123lm334'))

2) 重复 - 在正则中可以通过\N来重复它前面第N个分组匹配到的结果

‘234-234’、‘001-001’、‘890-890’

print(fullmatch(r'(\d{3})-\1', '234-234'))print(fullmatch(r'([a-z]{2})(\d{3})=\2\1{2}', 'mn891=891mnmn'))

3) 捕获 - 获取匹配结果的某个部分

捕获分为自动捕获和手动捕获两种,只有finddall具有自动捕获的功能,其他情况需要手动捕获

findall(正则表达式,字符串) - 获取字符串中所有满足正则的字串

from re import findall
message = '年龄:18岁, 身高:179, 体重:120斤, 月薪:3000元, 房租:1000元'result = findall(r'\d+', message)
print(result)      # ['18', '170', '120', '3000', '1000']result = findall(r'\d+元', message)
print(result)      # ['3000元', '1000元']

自动捕获 - 自动获取匹配结果分组匹配到的内容

result = findall(r'(\d+)元', message)
print(result)

手动捕获 - 写额外的代码来获取匹配结果中分组匹配到的内容

result = fullmatch(r'(\d+)元', '8292元')
print(result)

获取整个正则对应的匹配结果:匹配对象.group()

print(result.group())         # 8292元

获取某个分组对应的匹配结果:匹配对象.group(分组数)

print(result.group(1))        # 8292result = fullmatch(r'(\d{2})([a-z]{3})', '23ksk')
print(result)        # <re.Match object; span=(0, 5), match='23ksk'>print(result.group())      # 23ksk
print(result.group(1))     # 23
print(result.group(2))     # ksk

2. | - 分支

正则1|正则2 - 先用正则1去匹配,如果匹配成功整个正则表达式就匹配成功,如果匹配失败就用正则2来匹配。
‘23mns’、‘34看手机’

print(fullmatch(r'\d{2}([a-z]{3}|[\u4e00-\u9fa5]{3})', '23mns'))

五、检测类符号(了解)

from re import fullmatch, findall, search

检测类符号 - 在匹配成功的情况下,检测指定的位置是否复合相应的要求(不影响匹配,更不会影响字符串长度)

1. \b - 检测\b所在的位置是否是单词边界

单词边界:英文符号中可以区分出不同单词的符号(例如:空白符号、英文标点符号)

print(fullmatch(r'\d{2},\ba','23,a'))     # <re.Match object; span=(0, 4), match='23,a'>str1 = '123jsk5678换手机 789,89ksk890 数 899'
print(findall(r'\d+', str1))        # ['123', '5678', '789', '89', '890', '899']
print(findall(r'\b\d+', str1))      # ['123', '789', '89', '899']
print(findall(r'\d+\b', str1))      # ['789', '890', '899']
print(findall(r'\b\d+\b', str1))    # ['789', '899']

2. ^ - 检测是否是字符串开头

3. $ - 检测是否是字符串结尾

sreach(正则, 字符串) - 获取字符串中第一个满足条件的字串

print(search(r'\d{3}', 'sgg789几十739块'))
print(search(r'^1[3-9]\d{9}$', '13678992310'))

4. 转义符号 - 在正则中有特殊意义的符号前加\,让这个符号变成普通符号

# '合.234'、'块.82902'
print(fullmatch(r'[\u4e00-\u9fa5]\.\d+', '和.233'))# '2*8'、'3*8'
print(fullmatch(r'\d\*\d','2*3'))# '(MHS)'、'(KLS)'
print(fullmatch(r'\([A-Z]{3}\)', '(HUK)'))

5. re模块 - 模块全是和正则表达式相关的函数

from re import fullmatch, match, search, findall, finditer, sub, split

  1. fullmatch(正则, 字符串) - 匹配整个字符串(判断整个字符串是否符合正则描述的规则),匹配成功返回匹配对象,匹配失败返回None
  2. match(正则, 字符串) - 匹配字符串开头(判断字符串开头是否符合正则描述的规则),匹配成功返回匹配对象,匹配失败返回None
  3. search(正则, 字符串) - 匹配字符串中第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
  4. findall(正则, 字符串) - 获取字符串中所有满足正则的子串,返回值是一个列表,列表中的元素是匹配到字符串
  5. finditer(正则, 字符串) - 获取字符串中所有满足正则的子串,返回值是一个迭代器,迭代器中的元素是匹配对象
  6. split(正则, 字符串) - 将字符串中所有满足正则的子串作为切割点对字符串进行切割
  7. sub(正则, 字符串1, 字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1
str1 = '换手机2839就是就是09,hs78 728m开始 89'
result = findall(r'\d+', str1)
print(result)       # ['2839', '09', '78', '728', '89']result = finditer(r'\d+', str1)
print(result)
print(next(result))     # <re.Match object; span=(3, 7), match='2839'>
print(list(result))result = split(r'\d+', str1)
print(result)       # ['换手机', '就是就是', ',hs', ' ', 'm开始 ', '']result = sub(r'\d+|[a-zA-Z]+', 'A', str1)
print(result)       # 换手机A就是就是A,hsA Am开始 A

Day14-正则表达式相关推荐

  1. java二位数组biaoda_java基础 day14 数组 二维数组 冒泡排序 例题(正则表达式)

    数组: 数组静态初始化及遍历 package wwl.array; import java.util.Arrays; /** * 数组的静态初始化及数组遍历 * */ public class Tes ...

  2. day26 re正则表达式

     Python之路,Day14 = Python基础14 1 compile() 2 match() 3 search() 4 findall() 5 6 m.group() # 括号里面剋跟参数,表 ...

  3. Python学习:day21正则表达式

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  4. Python学习:day20正则表达式

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  5. Java Study Notes_Design in 2023(Day01~Day14)

    文章目录 Day01:Java入门 1.1 Java的技术体系 1.2 Java快速入门 1.2.1 JDK.JRE与JVM 1.2.2 JDK环境变量配置 1.3 Java基础语法 1.3.1 注释 ...

  6. 【XML和Dom4j、正则表达式】

    day14 [XML和Dom4j.正则表达式] 今日内容 XML 定义XML----组成成员 解析XML----Dom4j,XPath 正则表达式 第一章 XML 1.1 XML介绍 1.1 什么是X ...

  7. 通过正则表达式校验手机号码,拿走即用!

    校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...

  8. Linux shell 学习笔记(15)— shell 正则表达式

    1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...

  9. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册

    前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...

  10. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

最新文章

  1. 10、查看索引(SHOW INDEX)
  2. jquery 取对象数组下标_JQuery使用index方法获取Jquery对象数组下标的方法
  3. 输入输出系统1 ----- 特性 输出输出方式
  4. 将安全信息应用到以下对象时发生错误 拒绝访问_手机资讯:拒绝「京东金融」事件再次发生|如何避免iPhone 应用私自获取照片...
  5. 聊聊内卷之下,直博和读完硕士再读博该怎么选择?
  6. 系统集成项目管理工程师_系统集成项目管理工程师,最热门的入户软考专业!...
  7. [译文]通过一个通俗易懂的方式来了解下WebAssembly(一)
  8. java 自定义报表_设计好的报表是如何在 web 上显示的
  9. 力扣 数组中的最长山脉
  10. Mysql 索引案例学习
  11. c语言编译器turbo,C语言编译器TurboC使用技巧解析
  12. 某程序员自述:我,三十多岁,逃离北上广,通过技术移民到加拿大!
  13. 一种基于定时任务检测物联网设备异常状态的方法
  14. goldengate mysql to oracle,goldengate mysql to oracle OGG-00146 求助!
  15. java利器下载_java利器app下载|
  16. 2022-04-14每日刷题打卡
  17. mongodb数据同步到elasticsearch的中间件,支持全量,增量,实时同步等多种同步情景。(syncs MongoDB to Elasticsearch in realtime) (Mong
  18. 潇洒郎:VMware固定虚拟机IP地址
  19. 【教程汇总】英文关键词发掘与整理
  20. B. Deadly Laser

热门文章

  1. 设置elment ui plus 的el table的边框线
  2. Latex如何插入多个图片,实现并排排列或者多行多列排列
  3. 基于matlab的pwm波形仿真与分析,基于Matlab的单相电压型PWM整流电路仿真与设计
  4. 加班的程序员:996 没有未来
  5. shell脚本 sh shebang “#!/bin/sh“
  6. 解决更新包与已安装应用的签名不一致的问题
  7. 有一位后代曾忏悔:他的祖父继承家里的淫业,到了他父亲那一代,果报现前
  8. 忽略validateRequest设置
  9. solr mysql dih_Solr结构化数据导入DIH
  10. windows10系统-11-高效软件