【Python】Python中的正则表达式

Python中的正则表达式

1.re模块使用入门

1.1 re.match 函数

函数定义:

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

函数语法:

re.match(pattern, string, flags=0)

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例:

# re.match()
print(re.match('www','www.euansu.cn'))
print(re.match('cn','www.euansu.cn'))

代码执行结果

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

代码示例:

strs = "Cats are smarter than dogs"
res = re.match(r'(.*) are (.*?) .*', strs, re.M|re.I)
if res:
    print(res.group())
    print(res.group(1))
    print(res.group(2))
    print(res.groups())

代码执行结果:

1.2 re.search 函数

函数定义:

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例:

print(re.search('www','www.euansu.cn'))
print(re.search('cn','www.euansu.cn'))

代码执行结果:

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

代码示例:

strs = "Cats are smarter than dogs"
res = re.search(r'(.*) are (.*?) .*', strs, re.M|re.I)
if res:
    print(res.group())
    print(res.group(1))
    print(res.group(2))
    print(res.groups())

代码执行结果:

1.3 re.sub 函数

函数定义:

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

函数语法:

re.sub(pattern, repl, string, count=0, flags=0)

函数参数说明:

参数描述
pattern匹配的正则表达式
repl替换的字符串,也可为一个函数。
string要被查找替换的原始字符串。
count模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

代码示例:

phone = '2004-959-959'
# 删除字符串中非数字的内容
num = re.sub(r'\D',"",phone)
print(num)

代码执行结果:

repl,也即要替换的内容是一个函数:

def double(matched):
    value = int(matched.group('value'))
    return str(value*2)
s = 'A23G4HFD567'
# (?P<value>\d+):匹配一个或多个数字
print(re.sub('(?P<value>\d+)',double,s))

代码执行结果:

1.4 re.compile 函数

函数定义:

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

函数语法:

re.compile(pattern[, flags])

函数参数定义:

  • pattern : 一个字符串形式的正则表达式

  • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

    1. re.I 忽略大小写

    2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境

    3. re.M 多行模式

    4. re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)

    5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

    6. re.X 为了增加可读性,忽略空格和 # 后面的注释

代码示例:

pattern = re.compile(r'\d+') # 匹配至少一个数字
# match函数匹配
res = pattern.match('one12twothree34four')
print(res)
# match函数从指定的位置开始匹配
# 从e开始匹配
res = pattern.match('one12twothree34four',2,10)
print(res)
# 从1开始匹配
res = pattern.match('one12twothree34four',3,10)
print(res)
print(res.group(0))
print(res.start(0))
print(res.end(0))
print(res.span(0))

代码执行结果:

1.5 re.findall 函数

函数定义:

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

函数语法:

findall(string[, pos[, endpos]])

函数参数定义:

  • string : 待匹配的字符串。

  • pos : 可选参数,指定字符串的起始位置,默认为 0。

  • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

代码示例:

pattern = re.compile(r'\d+')   # 查找数字
res = pattern.findall('euansu 123 google 456')
print(res)
res = pattern.findall('euansu 123 google 456',0,9)
print(res)

代码执行结果:

1.6 re.finditer 函数

函数定义:

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

函数语法:

re.finditer(pattern, string, flags=0)

函数参数定义:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例:

res = re.finditer(r"\d+","12a32bc43jf3")
print(res)
for item in res:
    print(item)
    print(item.group())

代码执行结果:

1.7 re.split 函数

函数定义:

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

函数语法:

re.split(pattern, string[, maxsplit=0, flags=0])

函数参数定义:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例:

print(re.findall('\W+','euansu, euansu, euansu.'))
# \W+ 匹配非字母数字及下划线
print(re.split('\W+','euansu, euansu, euansu.'))
print(re.split('\W+','euansu, euansu, euansu.',1))

代码执行结果:

2.贪婪模式与非贪婪模式

贪婪模式:在正则表达式中,*、+、?、{n}、{n,m} 等限定符默认都是贪婪模式的。也就是说,它们会尽可能多地匹配字符。

非贪婪模式:在限定符后面加上 ? 可以使其变为非贪婪模式。非贪婪模式会尽可能少地匹配字符。

代码示例:

# 以下的*和+都是贪婪模式的匹配
# *
print(re.match('\d*','13012345678sa'))
# +
print(re.match('\d+','13012345678sa'))
# 以下的?则是非贪婪模式
# ?
print(re.match('\d?','13012345678'))

代码执行结果:

数量匹配:匹配指定数量的字符,注意当指定的数量无上限的时候,也是贪婪模式。

代码示例:

# {m} 匹配出现的m个字符
print(re.match('\d{3}','130123456789')) # 结果 130
# {m,} 匹配出现的m以上的字符
print(re.match('\d{3,}','130123456789')) # 结果 130123456789
# {m,n} 匹配出现的[3,5]之间的字符
print(re.match('\d{3,5}','130123456789')) # 结果 13012

代码执行结果:

3.正则表达式的修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

代码示例:

print(re.match('www','WWW.EUANSU.CN'))
print(re.match('www','WWW.EUANSU.CN',re.I|re.U))

代码执行结果:

4.正则表达式的语法

模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:abc 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re{ n,}匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
re{ n, m}匹配 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个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全网最最最详细DataEase-V1部署前后端分离教程

前端代码准备 按照前端官方的介绍&#xff0c;推荐使用node.js 16版本左右的&#xff0c;由于V1的DataEase是使用的Vue2的项目工程&#xff0c;DataEase部署&#xff0c;前端node相关不应该太新。要是不知道如何去做的小伙伴可以看我的其中一篇博客文章&#xff0c; 如何使用…

Java源码项目基于springboot的江理工文档管理系统的设计与实现

大家好我是程序员阿存&#xff0c;在java圈的辛苦码农。辛辛苦苦板砖&#xff0c;今天要和大家聊的是一款Java源码项目基于springboot的江理工文档管理系统的设计与实现&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 项目源码&#xff1a;Java基…

103. Go单测系列3---mockey与convey综合实战

文章目录 前言断言mock整体使用方式&#xff1a;具体示例mock结构体方法mock普通函数序列化mock MySQL和Redis单测go-sqlmockminiredis F&Q1. 如何禁用内联和编译优化 前言 工作中&#xff0c;随着业务的快速发展&#xff0c;代码量级和复杂度也会随之快速增长&#xff0c…

GeoPy1.1 地理数据处理入门

原作者&#xff1a;Damon 高校教师&#xff0c;中科院 GIS 博士 本文为原文章基础上&#xff0c;加上自己以及GPT4.0的总结整理而来 原活动链接 目录 前言小练习&#xff1a;求一周的平均温度小练习&#xff1a;将文件夹下的文件路径都打印出来&#xff1a;小练习&#xff1a…

【微信小程序页面出现onReachBottom不触发的情况】

微信小程序页面出现onReachBottom不触发的情况 源代码的情况是 /** * 页面上拉触底事件的处理函数 */ onReachBottom() {console.log("-------"); },.page {height: 100vh;width: 100vw;overflow-x: hidden; }无法触发的原因是&#xff1a;height设置为100vh,会导…

轻松掌握锁冲突问题的排查方法——《OceanBase诊断系列》之八

1. 前言 OceanBase数据库通过两阶段封锁机制确保读写事务并发控制的正确性。在高冲突场景下&#xff0c;事务处理中经常会遇到行锁冲突的问题。然而&#xff0c;许多OceanBase用户对于何时发生锁冲突&#xff0c;锁冲突的表现如何&#xff0c;以及如何排查锁冲突的原因&#x…

Anaconda 的一些配置

Anaconda 安装及修改环境默认位置 https://blog.csdn.net/qq_54562136/article/details/128932352 最重要的一步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;改文件夹权限 Anaconda创建、激活、退出、删除虚拟环境 修改pip install 默认安装路径

【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)

文章目录 题目思路解法 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间…

数学与简单dp

1205. 买不到的数目 - AcWing题库 import java.util.*;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();System.out.print((n - 1) * (m - 1) - 1);} } 1211. 蚂蚁感冒 - AcWing题库…

告别“死记硬背”,坐席助手让客服新手秒变大咖

在客服行业&#xff0c;新手客服人员常常面临着两大难题&#xff1a;一是需要死记硬背大量的标准答案&#xff0c;二是培训时间长&#xff0c;上岗速度慢。然而&#xff0c;随着科技的发展&#xff0c;这些问题正逐渐得到。今天&#xff0c;我们要为大家介绍一款革命性的客服工…

【考研数学】张宇《1000题》做不下来怎么办?

张宇1000题其实非常考察基础知识&#xff0c;如果你基础没有打好就直接开始刷的话会发现挺难刷下来的 1000题还是更适合在强化阶段来刷&#xff0c;刷早了把心态刷崩掉也没什么用... 基础不好或者0基础的还是建议从简单的1800开始刷起来 同时也要非常注意刷题方法&#xff0…

二叉树——501.二叉搜索树中的众数、 236. 二叉树的最近公共祖先

二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST …

网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程&#xff0c;主要讲了网络、网络协议模型以及UDP编程 网络 网络主要是进行&#xff1a;数据传输和数据共享 网络协议模型 OSI协议模型应用层 实际发送的数据表示层 发送的数据是否加密会话层 是否建立会话连接传…

2024暑期实习八股笔记

文章目录 自我介绍MySQL索引索引种类、B树聚簇索引、非聚簇索引联合索引、最左前缀匹配原则索引下推索引失效索引优化 日志、缓冲池redo log&#xff08;重做日志&#xff09;刷盘时机日志文件组 bin log&#xff08;归档日志&#xff09;记录格式写入机制 两阶段提交undo log&…

洛谷 素数环 Prime Ring Problem

题目描述 PDF 输入格式 输出格式 题意翻译 输入正整数 nn&#xff0c;把整数 1,2,\dots ,n1,2,…,n 组成一个环&#xff0c;使得相邻两个整数之和均为素数。输出时&#xff0c;从整数 11 开始逆时针排列。同一个环恰好输出一次。n\leq 16n≤16&#xff0c;保证一定有解。 多…

某宝某猫商品详情页面数据逆向

​​​​​逆向网址 aHR0cHM6Ly93d3cudGFvYmFvLmNvbS8 aHR0cHM6Ly93d3cudG1hbGwuY29tLw 逆向链接 aHR0cHM6Ly9kZXRhaWwudG1hbGwuY29tL2l0ZW0uaHRtP2lkPTc0NDk3NDQ4NTI3NSZwdmlkPTFiMzdmNjUyLTRjNDYtNGM2Ni04MDg4LWRhYmJiZDJhMzJhNSZzY209MTAwNy40MDk4Ni4yNzY3NTAuMCZzcG09YTIxY…

12、MongoDB -- 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

目录 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库&#xff08;传统的同步API编程&#xff09;演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 代码演示同步API编…

基于SpringBoot和PotsGIS的各省地震震发可视化分析

目录 前言 一、后台接口研发 1、控制层实现 2、Mapper访问层 3、空间查询分析 二、前端可视化展示 1、主体地图定义 2、行政区划列表定义 3、行政区划定位 三、数据分析 1、北京市 2、广东省 3、青海省 4、湖南省 总结 前言 在之前的博文中&#xff0c;我们…

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

每日OJ题_牛客OR57 手套

目录 牛客OR57 手套 解析代码 牛客OR57 手套 手套_牛客题霸_牛客网 class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {} }; 解析代码 class Gloves { public:int findMinimum(int n, vector<int> left, vector<i…