week03day04(正则表达式2)

一. 正则表达式

1. 匹配次数相关的正则符号

a.   '+'       一次或多次(至少一次) ,控制+ 前面元素的次数,看下面事例
from re import fullmatch'''
a+      至少一个a ,
\d+     至少一个数字字符'''
result = fullmatch(r'1a+2','1aaaaaaaa2') #1和2中间至少要有一个a
print(result)result = fullmatch(r'1\d+2','1454454545452') #1和2之间至少要有一个数字字符
print(result)result = fullmatch(r'1[A-Z]+2','1DFER2')
print(result)
b.  ' * '  任意次数 
result = fullmatch(r'1a*2','12') #和 + 唯一区别是, 可以一个元素都没有
print(result) # 1和2之间可以任意个a,可以没有a
c.  ' ? '     ---  0次或者1次, 最多一次
result = fullmatch(r'1[\u4e00-\u9fa5]?2','1吗2') #1 和2之间0或1个中文字符
print(result)
d.   { }   

        { N }  N次

      { M,N }  M到N次

       {M,}.     至少M次

        { ,N } 最次

result = fullmatch(r'1[3-9]\d{3}','13111') #\d任意数字字符只能三次
print(result)result = fullmatch(r'1[3-9]\d{3,5}','1311111')#\d任意数字字符可以出现3次到5次(3,5也行)
print(result)result = fullmatch(r'1[3-9]\d{3,}','13111') # 最少3次
print(result)result = fullmatch(r'1[3-9]\d{,3}','1311') #最多三次,这里是两次
print(result) 

2. 贪婪和非贪婪

  1.定义:
  • 如果在正则表达式中有不确定的匹配次数,这个正则在匹配字符串的时候可以分为贪婪和非贪婪两种模式
  2. 贪婪(默认)
  • 定义:如果一个字符串和正则进行匹配的时候有多种情况可以匹配成功,贪婪取最多的那个次数进行匹配
    3.非贪婪( +?, *?, ??, {M,N}?, {M,}?, {,N}? )
  • 定义:如果一个字符串恶和正则进行匹配时有多种情况可以匹配成功,非贪婪取最少的那个次数进行匹配
result = match(r'a[a-z]+?b','amnbdfdfbdfdfdfbd')
print(result)#这样只会选择amnb, +? 是取最小的满足匹配规则的

3. match 和 fullmatch

   match(正则表达式, 字符串)   --- 匹配字符串开头
result = match(r'\d{3}','123的粉红色答复哈水电费哈水淀粉')
print(result)
#只匹配开头123,后面多少都可以# 注意
result = match(r'a[a-z]+b','amnbdfdfbdfdfdfbd')
print(result)
#首先默认贪婪, 这里是a和b中间可以任意a-z字母, 但是后面这种有很多选择,amnb可以
#amnbdfdfb可以

4. 其他符号 

   1. 分组      ()
  • a. 整体操作: 将正则表达式中的一部分内容用 () 括起来表示一个整体
result = fullmatch(r'(\d\d[a-z]{3}){3}','99qwe44ewq35oer')
print(result) 
#( )括号括起来的一部分是一个整体,两个数据+三个字母 重复三次result = fullmatch(r'(\d[A-Z])+abc','2W8Jabc')
print(result)
# 这里是  任意数字和任意大写字母的一个组合,可以重复多次, 最后加上 abc 

  • b. 重复    - 在正则表达式中可以用 \N  来重复 \N前面的第N个分组匹配到的内容
result = fullmatch(r'(\d{3})([A-Z]{2})=\2\1{3}','123AD=AD123123123')
print(result)'''先任意数字字符三个,选择123然后任意一个大写字母,选择两个 AD再来一个 = 再\2 第二个分组也就是 选个字母 执行两次 ,再来一个AD再是\1{3} , 就是第一个分组, \d{3} 执行3次 ,也就是123 再写3次'''
  •    c. 捕获 :获取匹配结果的时候只获取正则表达式中某个分组匹配到的内容

                1.自动捕获:findall 函数支持自动捕获(findall在获取匹配结果的时候自动获取分组匹配到的结果)      

       findall(正则表达式, 字符串)  ---  获取字符串所有符合正则表达式所描述的规则子串     

result = findall(r'\d{3}','123AD=AD1231dfer231ddd23')
print(result) #找三个连续数字字符
#['123', '123', '231']# 提取  前面要有中文字符的连续三个数字
result = findall(r'[\u4e00-\u9fa5](\d{3})','的123AD=AD大方123dfer的f231ddd23')
print(result) # 将三个连续字符这个要求用 () 分组 框起来,就只获取分组中内容
#['123', '123']

                  2.手动捕获: fullmatch 、match、search、finditer的结果都支持手动捕获   

  • match        
result = match(r'([\u4e00-\u9fa5])(\d{3})','的123AD=AD大方123dfer的f231ddd23')
print(result.group(1),result.group(2),result.group())# 的 123 的123
'''
result.group() 是输出你所要求的部分, 这里就是汉字+三个数字。汉字是第一个分组(括号括起来的)
result.group(1) 是你要求的部分且用分组符号括起来的, 就是汉字
result.group(2)  第二部分,就是 三个连续数字 
'''
2. 分支        ' | '
  • 语法: 正则1|正则2       理解为 or ,先让正则1和字符串匹配,如果失败再用正则2和字符串进行匹配(两个正则中只要有一个匹配成功就成功)
result = fullmatch(r'\d{3}abc|[A-Z]{3}abc','QWEabc')
print(result) 
# 这是三个数字+abc 或 三个大写字母+abc都可result = fullmatch(r'(\d{3}|[A-Z]{3})abc','123abc')
print(result)# 用 分组() 框起来的部分,+abc , 分组中的 | 前后满足其一即可,最后是abc
3. 转义字符      在有特殊意义的符号前面加 \ , 让其功能消失变成一个普通符号。 注意:单独存在有特殊意义(除了\d  \s  \w等)的符号放在[ ]里面他的功能也会消失,变成普通符号 ( ‘-’ 号只能放在最前或最后面,其他地方要加  \- ,    ^ 也是)
result = fullmatch(r'\d\d\.\d\d','23.55')
print(result)
# 想让一个小数进行匹配, 因为 . 在正则中是匹配任意字符功能,加个 \ ,让其功能消失result = fullmatch(r'\d\d[.]\d\d','23.45')
print(result)result = fullmatch(r'\(\d{3}\)','(183)')
print(result)# 放在[] 里 符号失去功能
result = fullmatch(r'[.+?*(){}]abc','{abc')
print(result)
4. 检测类符号      (先匹配,如果匹配成功再检测,检测类所在的位置是否符合要求)
  • ^      - 检测是否是字符串开头(只能放在正则的开头)
  • $      - 检测是否字符串结尾(只能放在结尾)
  • \b     - 检测是否是单词边界(凡事可将两个英文单词区分开的符号都是单词边界:空白、英文标点符号、字符串开头和结尾)
  • \B     - 检测是否不是单词边界(board)
result = fullmatch(r'\d{3}\s\babc','342 abc')
print(result)
#\s 在这是空格, \b 检测a前面是否是单词边界

5. re模块

     1. fullmatch 、 match、 search
  • fullmatch(正则表达式,字符串)     --- 完全匹配(让整个字符串进行匹配),如果匹配成功返回匹配对象,失败返回None
  • match(正则表达式,字符串)        --- 匹配字符串开头,如果匹配成功返回匹配对象,失败返回None
  • search(正则表达式,字符串)       --- 匹配字符串中第一个满足正则的子串,如果匹配成功返回匹配对象,失败返回None
     2.findall 、finditer
  • findall(正则表达式,字符串)     --- 获取字符串中所有满足正则表达式的子串,结果是个列表,列表内容是字符串(正则中如果有分组会自动捕获)
result = findall(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(result)
#['343', '454', '934', '343']
  • finditer(正则表达式,字符串)    --- 获取字符串中所有满足正则表达式的子串,结果是一个是迭代器,迭代器中元素是匹配对象
result = finditer(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(list(result))
'''
[<re.Match object; span=(2, 5), match='343'>,<re.Match object; span=(6, 9), match='454'>, 
<re.Match object; span=(12, 15), match='934'>,'''
     3. splite(正则表达式,字符串)       
  • 将字符串所有满足正则的子串作为切割点对字符串进行切割
  • splite(正则表达式,字符串,N)    将字符串前N个满足正则的子串作为切割点对字符串进行切割
result = split(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(result)result = split(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法',3)
print(result)

4.sub
  •       sub  (正则表达式,字符串1,字符串2)   将字符串2中所有满足正则的子串都换成字符串1

  •       sub  (正则表达式,字符串1,字符串2,N)   将字符串2中前N 个满足正则的子串都替换成字符串1
result = sub(r'\d{3}','+','是的343非454非地方934非地方地方ffdf343方法')
print(result)
# 把连续三个数字换成 +
#是的+非+非地方+非地方地方ffdf+方法result = sub(r'\d{3}','+','是的343非454非地方934非地方地方ffdf343方法',2)
print(result)
# 只换前两个
#是的+非+非地方934非地方地方ffdf343方法
5.正则参数
   a.    1.  忽略大小写    匹配的时候让同一个字母的大写和小写相同

        r'(?i)正则表达式' 

result = fullmatch(r'(?i)[a-z]\d{3}','R345')
print(result)
       a.   2.  加参数  I (ignorecase)  from re import I   也是忽略大小写

        给正则函数 flags = I

result = fullmatch(r'[a-z]\d{3}','R345',flags= I)
print(result)
   b. 单行匹配 (默认是多行匹配)
  • 多行匹配时正则中的 ' . '不能和 \n 匹配, 单行匹配的时候正则中的 ' . ' 是可以和 \n 进行匹配的 , 加一个(?s) s是single 单行匹配

result =  fullmatch(r'(?s)a.b','a\nb')
print(result)
  • 或者给正则函数flags 赋值为S(re模块中的S)
result =  fullmatch(r'a.b','a\nb',flags=S)
print(result)
 如何做到 又忽略大小写 又转为单行匹配
# 用(?si)
result =  fullmatch(r'(?si)a.b','A\nb')
print(result)# flags 参数赋值  S | I
result =  fullmatch(r'a.b','A\nb',flags=S|I)
print(result)# flags参数给s 成单行匹配, 在前面(?i)忽略大小写
result =  fullmatch(r'(?i)a.b','A\nb',flags=S)
print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

内网情况配置 wsl 和 vscode。在wsl中下载不了 vscode 的核心。 报错&#xff1a; ERROR: Faild to download https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628c612102e30a681/server-linux-x64/stable 很多情况下是没有现成的VS Code Server程序的&…

三好夫人:真爱战胜一切

真爱如同飞蛾扑火&#xff0c;明知前方是毁灭&#xff0c;却仍心甘情愿地奔赴。如果一个男人真心爱你&#xff0c;他会倾尽所有&#xff0c;不遗余力地满足你的需求。这份爱&#xff0c;会在他的言行举止中流露出来。男人对你的爱&#xff0c;常常表现在他的言语之中。 如果他爱…

桌面显示器应用Type-C接口有什么好处

随着科技的不断发展&#xff0c;桌面显示器作为我们日常工作中不可或缺的设备之一&#xff0c;也在不断更新换代。其中&#xff0c;Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么&#xff0c;桌面显示器应用Type-C接口究竟有什么好处呢&#xff1f; 首先&#xff…

本地运行面壁智能的“贺岁模型”:MiniCPM 2B

简单聊聊可以在端侧运行的 Mini CPM 2B SFT / DPO 版本的模型。 写在前面 模型是好是坏&#xff0c;其实不用看公众号们的营销&#xff0c;小马过河问题&#xff0c;自己试试就知道了。当然&#xff0c;2B 参数量的模型&#xff0c;适合的场景肯定不是 34B / 70B 所擅长的&am…

VBA_MF系列技术资料1-325

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于…

项目安全问题及解决方法------使用合适的算法

Spring Security 已经废弃了 MessageDigestPasswordEncoder&#xff0c;推荐使用 BCryptPasswordEncoder private static BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder(); GetMapping("performance")public void performance() {StopWatch st…

图数据库Neo4j集成springboot及导入数据踩坑问题

文章目录 ----------------------------------常用cql------------------------------------删除所有节点删除指定节点删除所有关系删除指定关系查看所有节点查看某种节点查看总节点数删除所有关系节点删除所有关系 ------------------------------手动导入数据---------------…

android开发---简单购物商城(JAVA) (一)

包括&#xff1a;商品展示&#xff0c;商品详情&#xff0c;购物车&#xff0c;删除&#xff0c;一键清除&#xff0c;返回 运用sqllist 另外因为一篇写不下 继续可看 源码二 下面是目录 运行样子 下面是源码 AndroidManifest.xml <?xml version"1.0" e…

代码随想录算法训练营29期Day37|LeetCode 738,968

文档讲解&#xff1a;单调递增的数字 监控二叉树 贪心算法总结 738.单调递增的数字 题目链接&#xff1a;https://leetcode.cn/problems/monotone-increasing-digits/description/ 思路&#xff1a; 题目要求小于等于N的最大单调递增的整数&#xff0c;那么拿一个两位的数字…

Android 8.1 铃声音量通话音量同步调节

Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…

统计图表在线配置服务-百度 SugarBI的学习笔记

最近&#xff0c;有个产品要支持统计图表在线可配置&#xff0c;这样&#xff0c;当用户有新增统计指标的需求时&#xff0c;运维人员通过界面化配置&#xff0c;就可以增加统计指标了&#xff0c;不用开发写代码&#xff0c;画页面了。 上网查了下相关的组件&#xff0c;感觉…

SG2520CAA汽车用晶体振荡器

爱普生SG2520CAA是简单的封装晶体振荡器&#xff08;SPXO&#xff09;&#xff0c;具有CMOS输出&#xff0c;这款SPXO是汽车和高可靠性应用的理想选择&#xff0c;符合AEC-Q200标准&#xff0c;功耗低&#xff0c;工作电压范围为1.8 V ~ 3.3 V类型&#xff0c;宽工作温度-40℃~…

VPP学习-startup.conf配置文件

背景 VPP&#xff08;Vector Packet Processing&#xff0c;矢量报文处理&#xff09;&#xff0c;作为一个开源的高性能数据包处理框架&#xff0c;旨在提供可扩展、灵活且高效的网络数据包处理能力&#xff1b;由于传统Linux 内核协议栈整体网络吞吐性能的局限性&#xff0c;…

PyTorch和TensorFlow的简介

一、PyTorch和TensorFlow的简介 1.1 Pytorch PyTorch是由Facebook开发的一个开源深度学习框架&#xff0c;它提供了一个动态计算图模型&#xff0c;可以在GPU上运行。它于2017年首次发布。PyTorch提供了一个灵活、动态的计算图&#xff0c;使得深度学习模型的构建和调试更加直…

【Linux】环境基础开发工具的使用之gcc详解(二)

前言&#xff1a;上一篇文章中我们讲解了Linux下的vim和yum的工具的使用&#xff0c;今天我们将在上一次的基础上进一步的讲解开放工具的时候。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4a…

小程序配置服务器域名:步骤与注意事项

随着移动互联网的普及&#xff0c;小程序已成为许多企业和开发者的首选应用形式。为了确保小程序的正常运行和最佳用户体验&#xff0c;服务器域名的配置至关重要。本文将详细介绍小程序配置服务器域名的步骤及注意事项。 一、为什么要配置服务器域名&#xff1f; 小程序运行…

ESU毅速丨为什么增材制造广受关注?

随着科技的飞速发展&#xff0c;增材制造3D打印技术逐渐成为制造业的新宠。包括航空航天、汽车、家电、电子等各行业都在积极拥抱3D打印&#xff0c;为什么3D打印能引起制造业广泛关注与应用&#xff1f;它的主要优势有哪些&#xff1f; 首先&#xff0c;3D打印减少浪费。3D打印…

【Linux】 Linux编译器-gcc/g++使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. Linux编译器-gcc/g使用1.1 引入1.2 初识gcc/g1.3 程序运行的四个阶段1.3.1 预处理1.3.2 编译1.3.3 汇编1.3.4 链接 1.…

【2024.2.1练习】岛屿个数(15分)

题目描述 题目思路 题目乍一看类似于“水坑个数问题”&#xff0c;是对陆地块进行DFS,上下左右4个方向分别对应了四种状态转移&#xff0c;每块陆地进行搜索后变成海洋&#xff0c;最终搜索次数就是岛屿个数。 但在子岛屿存在的情况下&#xff0c;需要先对海洋块进行DFS,由于…

binder android

文心一言的回答 Binder驱动是Android操作系统中用于进程间通信&#xff08;IPC&#xff09;的机制。它提供了一种高效、跨进程的数据传输方式&#xff0c;使得应用程序的不同组件可以在Android系统上互相通信。 Binder驱动基于Linux内核&#xff0c;其核心组件是一个称为Bind…