python学习第七节:正则表达式

news2024/9/21 2:44:41

python学习第七节:正则表达式

在这里插入图片描述

正则表达式基本上在所有开发语言中都会使用到,在python中尤为重要。当我们使用python开发爬虫程序将目标网页扒下来之后我们要从网页中解析出我们想要的信息,这个时候就需要正则表达式去进行匹配。

import re

re的常量

re模块中有9个常量,常量的值都是int类型!(知道就行)

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

使用方法:

import re
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   #使匹配对大小写不敏感
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.S)   #匹配包括换行符在内的任意字符

下面这这张图是我从网上扒的,不是很清楚,看看就行
在这里插入图片描述

re的函数

这个才是重点!
在这里插入图片描述
在这里插入图片描述

1.查找一个匹配项

re.search()函数

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

import re
print(re.search('www', 'www.runoob.com'))# 在起始位置匹配,返回:<re.Match object; span=(0, 3), match='www'>
# span用于返回字符串中指定字符的起始位置和结束位置
print(re.search('com', 'www.runoob.com').span())#返回:(11, 14)

# 还可以提前设置匹配规则
pat=re.compile("AA") #此出的AA,是正则表达式,用来去验证其他的字符串
print(pat.search("CBA")) #返回None
print(pat.search("AABBCC")) #返回 <re.Match object; span=(0, 2), match='AA'>

# 注意,如果未匹配到,会返回 None
re.match(pattern, string, flags=0) 函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。换句话说就是匹配字符串是不是以指定字符开头的,如果不是就返回None

import re
print(re.match('www', 'www.runoob.com').span())  # 返回:(0, 3)
print(re.match('com', 'www.runoob.com'))         # 返回None

re.match 与 re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到第一个匹配。

re.fullmatch(pattern, string, flags=0) 函数

这个函数就表示必须完全匹配整个字符串,不能匹配部分字符串;换句话说就是两个字符串要完全一样才可以,否则会返回None

import re
print(re.fullmatch('www.runoob.com', 'www.runoob.com')) # 必须完全匹配整个字符串
print(re.fullmatch('com', 'www.runoob.com')) # 返回:None

2.查找多个匹配项

re.findall(pattern, string, flags=0) 函数

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

import re
result1 = re.findall(r'\d+','runoob 123 google 456')
print(result1 ) #返回:['123', '456']
pattern = re.compile(r'\d+')   # 查找数字
result2 = pattern.findall('runoob 123 google 456')
result3 = pattern.findall('run88oob123google456', 0, 10)  #从字符串的0到10匹配
print(result2 ) #返回:['123', '456']
print(result3 ) #返回:['88', '12']

print(re.findall("a","ASDaDFGAa")) #返回: ['a', 'a']
print(re.findall("[A-Z]","ASDaDFGAa")) #返回: ['A', 'S', 'D', 'D', 'F', 'G', 'A']
print(re.findall("[A-Z+]","ASDaDFGAa")) #返回: ['A', 'S', 'D', 'D', 'F', 'G', 'A']
re.finditer(pattern, string, flags=0) 函数

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

import re
it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group() )

3.分割

re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数, flags表示模式,就是上面我们讲解的常量!

re.split(pattern, string, maxsplit=0, flags=0) 函数

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

import re
print(re.split(r'\W+','runoob, runoob, runoob.')) #返回:['runoob', 'runoob', 'runoob', '']
print(re.split(r':','runoob:runoob:runoob.')) #返回:['runoob', 'runoob', 'runoob.']
print(re.split(r'(\W+)',' runoob, runoob, runoob.')) #返回:['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
print(re.split(r'\W+',' runoob, runoob, runoob.', 1)) #返回:['', 'runoob, runoob, runoob.']
print(re.split(r'a*','hello world')) #返回:['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']
# 对于一个找不到匹配的字符串而言,split 不会对其作出分割

4.替换

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

re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。

pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。

import re
print(re.sub('[a]','x','abcdef'))   # 第1个参数:正则表达式;第2个参数:替代值;第3个参数:被替代字符串
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)

值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。

re.subn(pattern, repl, string, count=0, flags=0) 函数

re.subn(pattern, repl, string, count=0, flags=0) 函数与 re.sub函数 功能一致,只不过返回一个元组 (字符串, 替换次数)。

print(re.sub('[ae]','x','abcdef'))   # 第1个参数:正则表达式;第2个参数:替代值;第3个参数:被替代字符串
返回:('xbcdxf', 2)  #替换了2次

5.编译正则对象

re.compile(pattern, flags=0) 函数

compile函数 与 template函数 将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数(后面我们会讲解Pattern正则对象)。

import re
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')
print(m)       # 匹配成功,返回一个 Match 对象

正则表达式模式

操作符说明示例
.表示任何单个字符(换行符除外)
[ ]字符集,对单个字符给出取值范围[abc]表示a、b、c,[a-z]表示a到z单个字符
[^ ]非字符集,对单个字符给出排除范围^abc]表示非a或b或c的单个字符
*前一个字符0次或无限次扩展abc* 表示 ab、abc、abcc、abccc等
+前一个字符1次或无限次扩展abc+表示 abc、abcc、abccc等
?前一个字符0次或1次扩展abc?表示 ab、abc
{m}扩展前一个字符m次ab{2}c表示abbc
{m,}扩展前一个字符m次以上ab{2}c表示abbc abbbc abbbbc …
{m,n}扩展前一个字符m至n次(含n)ab{1,2}c表示abc、abbc
^匹配字符串开头^abc表示abc且在一个字符串的开头
$匹配字符串结尾abc$表示abc且在一个字符串的结尾
( )分组标记,内部只能使用 操作符(abc)表示abc,(abc竖线def)表示abc、def
<.+>默认贪婪匹配任意字符
<.+?>懒惰匹配任意字符
\d数字,等价于[0-9]
\w单词字符,等价于[A-Za-z0-9_]
\W匹配所有非字母数字,即符号,够同于 [^\w]
\D匹配非数字:[^\d]
\ s匹配所有空格字符(包括换行符和tab),等同于:[\t\n\f\r\p{Z}]
\S匹配所有非空格字符:[^\s]
\f匹配一个换页符
\n匹配一个换行符
\r匹配一个回车符
\t匹配一个制表符
\v匹配一个垂直制表符
\p匹配 CR/LF(等同于\r\n),用来匹配 DOS 行终止符

还有一个符号,因为上面表格打不出来所以下面单独做说明:
操作符:| 说明:左右表达式任意一个 示例:abc|def 表示 abc、def ;(a|b)表示匹配a或者b;(ab)|(cd)表示匹配ab或者cd

^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当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个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

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

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

相关文章

由于找不到steam_api.dll,无法继续执行代码的科学修复方法分析,靠谱实用!

当你尝试运行依赖Steam平台的游戏或应用程序时&#xff0c;可能会遭遇一个很让人无奈的错误信息&#xff1a;“由于找不到steam_api.dll,无法继续执行代码”。通常&#xff0c;这是由于系统中缺失或损坏了steam_api.dll文件所致。以下是五种详细的解决方案&#xff0c;助你迅速…

word文档的读入(4)

刚刚我们获取到的是段落和样式块对象&#xff0c;要想读取到真正的文本内容&#xff0c;需要通过.text属性来访问。不同的需求对应不同的操作。比如&#xff1a;如果想读取某一段落中的所有文本&#xff0c;就使用.paragraphs[{段落索引}]获取到段落对象后&#xff0c;再访问它…

tensor 的运算(加法、点乘、矩阵乘法)

文章目录 案例准备加法点乘矩阵乘法注意 案例准备 import torcha torch.tensor([[1,2,3],[4,5,6],[7,8,9]], dtypetorch.float) b torch.tensor([[10,10,10,],[10,10,10],[10,10,10,]], dtypetorch.float)此时a,b为 加法 a 100a b a.add(b)点乘 a * b矩阵乘法 a b a…

牛客周赛 Round 58(上)

会赢吗&#xff1f; 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> using namespace std;int main() {double w;int h;cin >> w >> h;if (h - w > 0) {cout << "YES" << endl;} else {cout <&…

Java中SringBoot服务连接多个MySQL数据源案例实战

Java中SringBoot服务连接多个MySQL数据源案例实战 1.场景2.取消默认的单数据源配置3.自定义多数据源配置文件4.自定义多数据源配置类1.DB1Config.java2.DB2Config.java 5.启动项目&#xff0c;测试操作多数据源 1.场景 A服务&#xff08;供应商&#xff09;有一套自己的数据库…

每周心赏|教师节“AI大礼包”:3款教学神器让你AI不释手

教师节“AI大礼包”真的来了&#xff01; 家人们谁懂啊&#xff0c;当学生时不想上课&#xff0c;当老师后不想上班…… 3款超会整活的教师必备AI神器&#xff0c;终于让我给挖到了&#xff1a;一键拥有金牌名师教学经验&#xff0c;助力撰写教案、高效赋能学生、总结工作成果…

10BASE-T1S 接口转换器

10BASE-T1S 接口工具 车载网络的发展正在经历一场转型变革&#xff0c;点对点和总线拓扑的融合现在已成为现实。为应对这一变革&#xff0c;我们推出了新颖的 10BASE-T1S 接口转换器&#xff0c;这是一款创新的以太网桥接器&#xff0c;它弥合了这两种不断发展的技术之间的差距…

【Python机器学习】循环神经网络(RNN)——对RNN进行预测

目录 有状态性 双向RNN 编码向量 如果有一个经过训练的模型&#xff0c;接下来就可以对其进行预测&#xff1a; sample_1""" I hate that the dismal weather had me down for so long,when will it break! Ugh,when does happiness return? The sun is bl…

《深入浅出多模态》之多模态经典模型:InstructBLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

年薪30W的项目经理,都在用这个方法做项目!

看到很多新手项目经理不知道在带项目的时候应该怎么做&#xff0c;这里给大家整理了一份超牛的资深项目经理在日常工作中的带项目方法&#xff0c;大家有需要的可以收藏哦~&#xff01; 捋清思路&#xff0c;制定章程 在接手到一个新的项目时&#xff0c;项目经理要做的并不是…

农业品牌宣传:让绿色故事传遍万家!

合作咨询联系竑图 hongtu201988 乡村要振兴&#xff0c;品牌必须响亮&#xff01;农产品企业在追求渠道拓展与销量增长的同时&#xff0c;绝不能忽视品牌形象构建的基石作用。若缺乏稳固的品牌支撑&#xff0c;即便是再广阔的渠道与惊人的销量&#xff0c;也可能如同沙上建塔&…

灵魂绑定Tokens介绍和在Sui上的案例

灵魂绑定token&#xff08;Soulbound token&#xff0c;SBT&#xff09;这一术语由以太坊联合创始人Vitalik Buterin提出&#xff0c;是一种设计为永久且不可转让的NFT。与典型的NFT可以自由交易不同&#xff0c;SBT始终绑定于原始账户&#xff0c;就像游戏中的技能或成就一样与…

探索Python的隐秘角落:Keylogger库的神秘面纱

文章目录 探索Python的隐秘角落&#xff1a;Keylogger库的神秘面纱背景&#xff1a;为何需要Keylogger&#xff1f;库简介&#xff1a;什么是Keylogger&#xff1f;安装指南&#xff1a;如何将Keylogger纳入你的项目&#xff1f;函数使用&#xff1a;5个简单函数的介绍与代码示…

vue3 使用 codemirror 实现yaml文件的在线编辑

vue3 使用 codemirror 实现yaml文件的在线编辑 1. 使用情形2. 插件下载3. 封装yaml编辑器组件4. 父组件使用5. js-yaml 使用6. 备注 1. 使用情形 需要对yaml文件进行在线编辑&#xff0c;并且进行基础格式验证 2. 插件下载 vue-codemirror 在线代码编辑器插件 js-yaml 用于转…

RickdiculouslyEasy-CTF-综合靶场

步骤一&#xff1a;利用Goby搜索靶机地址 步骤二&#xff1a;访问靶机地址 步骤二&#xff1a;扫描端口 nmap 172.16.1.7 -p 1-65535 步骤三&#xff1a; 扫描目录 dirsearch -u http://172.16.1.7/ 第一个flag&#xff1a;命令&#xff1a;nmap -A -v -T4 172.16.1.7 -p 1-6…

MUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR

编辑&#xff1a;ll MUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR 型号&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220AB 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

Origin2024中绘制多因子分组柱状图,直观展示不同组别内的数据变化!

当我们需要对比多组平行数据时&#xff0c;采用Origin多因子分组柱状图&#xff0c;不仅可以直接的对比多组数据&#xff0c;同时还能够直观展示各个指标因子的数据变化及趋势 操作步骤&#xff1a; 1、先打开Origin2024软件&#xff0c;然后在Book1中输入如下示例数据&#…

边缘检测运用

文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 …

Qt与MQTT交互通信

MQTT全称是&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议 是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&#xff0c;常用于互联网中&am…