5. python re

news/2025/2/25 23:54:25/文章来源:https://www.cnblogs.com/supershy/p/18737559

5. python re

5.1 正则表达式模式

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
re 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) 对正则表达式分组并记住匹配的文本
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [ \t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

5.2 匹配方法

1)findall()

  • re.findall(pattern,string,flags=0) 该方法返回列表形式

    • pattern指定匹配的正则表达式,string指定要匹配的字符串,flags是标志位(用于控制正则表达式的匹配模式)
    In [8]: print(re.findall('com','163.com.com.com'))
    ['com', 'com', 'com']
    

2)match()

  • re.match() 参数与findall相同,该方法从字符串的起始位置匹配,若匹配成功返回match类型对象

    • 该方法只能使用group(num)或groups()方法获取比配的字符串
    In [1]: import reIn [2]: print(re.match('\d+','163.com'))
    <re.Match object; span=(0, 3), match='163'>In [3]: print(re.match('\d+','163.com').group())
    163In [4]: print(re.match('com','163.com'))	#不是起始位置
    None
    

3)search()

  • re.search() 与match方法用法基本相同,不同的是search()方法可在任意位置匹配,匹配成功返回第一个结果,结果也是match()类型

    In [5]: print(re.search('com','163.com'))
    <re.Match object; span=(4, 7), match='com'>In [6]: print(re.search('com','163.com').group())
    comIn [7]: print(re.search('com','163.com.com').group())	#只返回第一个匹配的结果
    com
    

5.3 替换方法

sub()

  • re.sub(pattern,repl,string,count=0,flags=0) 和字符串的replace()功能类似,用于替换字符串中的匹配项
    • repl参数指定替换的字符串,也可以是一个函数;count参数指定匹配后替换的最大次数,默认值0
In [9]: date_str="start 05/09/2022 end 06/26/2022"In [10]: re.sub(r'(\d+)/(\d+)/(\d+)',r'\3-\1-\2',date_str)
Out[10]: 'start 2022-05-09 end 2022-06-26'

5.4 分割方法

split()

  • re.split(pattern,string[,maxsplit=0,flags=0]) 和字符串的split()功能类似

5.5 编译正则表达式的方法

re.complie()

  • re.complie()方法用来编译正则表达式,生成一个正则表达式对象,供findall()、match()、search()等方法使用
  • “一处编译,多处使用”,编译的正则表达式比非编译的执行速度更快,适合大量文本的处理。
In [1]: import reIn [2]: re_obj=re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')In [3]: re_obj.search('inet 172.26.224.66/20 metric 100 brd 172.26.239.255 scope global dynamic eth0').group()
Out[3]: '172.26.224.66'

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

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

相关文章

百万架构师第四十四课:Nginx:Nginx 的扩展-OpenRestry|JavaGuide

百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的扩展-OpenRestry 课程目标Nginx 进程模型简介Nginx 的高可用方案OpenResty 安装及使用什么是 API 网关?OpenResty 实现灰度发布功能Nginx 进程模型简介 多进程TomcatBIO NIO AION…

不用 ORM 会发生什么?

要弄清一个事物带来了什么,有种办法就是在场景中去掉它,当我们不使用 ORM 开发项目,需要补齐哪些能力,以表格形式列举要补齐的功能点和意义。我们仅能通过 SQL语句和数据库交互,在采用 ORM 项目开发的项目有时出于性能、数据库表达限制的原因而直接编写 SQL 语句,在脱离 …

事务中无法切换数据源?DataSourceSwitchInvoker:轻松实现多数据源切换执行工具类

背景: 在有标注为@Transactional的类或公共方法中(传播特性,如:NOT_SUPPORTED、SUPPORTS、REQUIRED【默认值】、REQUIRES_NEW)执行数据源切换可能不成功(比如:主从数据源切换,多数据源切换等,均会发现切换不成功,或“偶尔又切换成功”),导致本应该需要查主库却查了…

Java基础05(常用类)

匿名内部类 Object类 包装类 String类 BigDecimal类 Date类(特定时间)Calendar类(日历)SimpleDateFormat类(格式化时间)System类(系统类)Java基础05(常用类) 内部类 成员内部类在类的内部定义,与实例变量、实例方法同级别的类外部类的一个实例部分,创建内部类对象…

mysql表字段varchar(10)和varchar(255)测试文件占用

前言全局说明一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 MySQL: 服务器版本: 5.6.34 - MySQL Community Server (GPL) Navicat for MySQL: 10.1.71.2 测试样本 两个字段: id字段是 1~10位不等长度的随机数; num字段是 11~25位不等的随机数字;为了更好模拟实际使…

FreeRTOS高效应用实战

FreeRTOS高效应用实战 基于STM32CubeIDE生成对芯片移植好的FreeRTOS工程,使用HAL库编写FreeRTOS应用程序,实现FreeRTOS高效应用实战引入函数句柄的概念函数句柄(Function Handle)是编程中用于间接引用和操作函数的一种机制,其本质是将函数作为数据来传递和存储。以下是关于…

解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题

整个学习过程是参考正点原子启明星开发板的2020.2版本嵌入式Linux开发指南,在学习uboot移植的时候遇到了问题。 新建工程和配置环境啥的和教程里都一样,就不罗嗦了,这里重点讲和教程不一样的地方(或者说教程里有问题的地方)。 新建工程后编译时遇到的报错 在按照教程新建ub…

markDown学习日记

标题 标题是通过#和一个空格来创建,标题的等级是通过#的个数来鉴别。 字体样式 进步进步进步 加粗效果由2个*前后包裹来实现 进步进步进步 斜体需要一个*来实现 (两者都实现需要三个*) 进步进步进步 删除需要两边都用波浪号 ~ 实现 引用明德新民 止于至善用>实…

LVM(Logical Volume Manager)

一. LVM概述 1. 什么是 LVM LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 系统下的一种 存储管理 机制,能够灵活地管理磁盘分区。它提供了一种比传统分区管理(如fdisk、parted)更高级的存储管理方式,允许动态调整存储空间,方便扩展和缩减分区,而不会影响已有数据…

碎片

平板电脑和手机最大的区别就在于屏幕的大小, 一般手机屏幕的大小会在 3 英寸到 6 英寸之间, 而一般平板电脑屏幕的大小会在 7 英寸到 10 英寸之间。屏幕大小差距过大有可能会让同样的界面在视觉效果上有较大的差异, 比如一些界面在手机上看起来非常美观, 但在平板电脑上看起来就…

作业1 随笔

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 学习使用markdown、博客园与GitHub,大致了解本学科1、自我介绍兴趣爱好:玩游戏,打羽毛球,喜欢拍照,喜欢理解学习软件工程专业的新东西 学习方面:主要学习Java,2、5个想弄懂的问题从事后…