当前位置: 首页 > news >正文

完整教程:Python进阶指南5:正则表达式

一、正则表达式概述

1.为什么要学习正则表达式

在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要

比如:邮箱、图片地址、手机号码等

这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式

在这里插入图片描述

2.什么是正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。
某种:也可以理解为是一种模糊匹配。

精准匹配:select * from blog where title=‘python’;

模糊匹配:select * from blog where title like ‘%python%’;

正则表达式并不是Python所特有的,在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。

3.正则表达式的功能

① 数据验证(表单验证、如手机、邮箱、IP地址)
② 数据检索(数据检索、数据抓取)
③ 数据隐藏(135****6235 王先生)
④ 数据过滤(论坛敏感关键词过滤)

二、re模块的介绍

1.什么是re模块

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个re模块

2.re模块使用三步走

# 第一步:导入re模块
import re
# 第二步:使用match方法进行匹配操作
result = re.match(pattern正则表达式, string要匹配的字符串, flags=0)
# 第三步:如果数据匹配成功,使用group方法来提取数据
result.group()
import re
if __name__ == '__main__':
my_str = "abc123xyz"
result = re.match(r"\n",my_str)
print(result)
print(result.group())

match函数参数说明:

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

匹配成功re.match方法返回一个匹配的对象,否则返回None。

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

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

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配,这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é" 或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.XVERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式。该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

3.re模块的相关方法

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

☆ re.findall(pattern, string, flags=0)

  • 扫描整个串,返回所有与pattern匹配的列表
  • 注意: 如果pattern中有分组则返回与分组匹配的列表
  • 举例: re.findall("\d","chuan1zhi2") >> ["1","2"]

☆ re.finditer(pattern, string, flags)

参数说明:

4.正则表达式快速入门

案例1:查找一个字符串中是否具有数字“8”

import re
result = re.findall('8', '13566128753')
# print(result)
if result:
print(result)
else:
print('未匹配到任何数据')

案例2:查找一个字符串中是否具有数字

import re
result = re.findall('\d', 'a1b2c3d4f5')
# print(result)
if result:
print(result)
else:
print('未匹配到任何数据')

案例3:查找一个字符串中是否具有非数字

import re
result = re.findall('\D', 'a1b2c3d4f5')
# print(result)
if result:
print(result)
else:
print('未匹配到任何数据')

三、正则表达式详解

1.正则表达式基础语法

正则表达式通常是由两部分数据组成的:普通字符 与 元字符

普通字符:0123456789abcd@…

元字符:正则表达式所特有的符号 => [0-9],^,*,+,?

2.查什么

代码功能
.(英文点号)匹配任意某1个字符(除了\n)
[ ]匹配[ ]中列举的某1个字符,专业名词 => 字符簇
[^指定字符]匹配除了指定字符以外的其他某个字符,^专业名词 => 托字节
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配非特殊字符,即a-z、A-Z、0-9、_
\W匹配特殊字符,即非字母、非数字、非下划线

字符簇常见写法:

① [abcdefg] 代表匹配abcdefg字符中的任意某个字符(1个)

② [aeiou] 代表匹配a、e、i、o、u五个字符中的任意某个字符

③ [a-z] 代表匹配a-z之间26个字符中的任意某个

④ [A-Z] 代表匹配A-Z之间26个字符中的任意某个

⑤ [0-9] 代表匹配0-9之间10个字符中的任意某个

⑥ [0-9a-zA-Z] 代表匹配0-9之间、a-z之间、A-Z之间的任意某个字符。没有顺序要求

字符簇 + 托字节结合代表取反的含义:

① [^aeiou] 代表匹配除了a、e、i、o、u以外的任意某个字符

② [^a-z] 代表匹配除了a-z以外的任意某个字符

\d 等价于 [0-9], 代表匹配0-9之间的任意数字

\D 等价于 [^0-9],代表匹配非数字字符,只能匹配1个

3.查多少

代码功能
*匹配前一个字符出现0次或者无限次,即可有可无(0到多)
+匹配前一个字符出现1次或者无限次,即至少有1次(1到多)
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有(0或1)
{m}匹配前一个字符出现m次,匹配手机号码\d{11}
{m,n}匹配前一个字符出现从m到n次,\w{6,10},代表前面这个字符出现6到10次

基本语法:

正则匹配字符.或\w或\S + 跟查多少

如\w{6, 10}

如.*,匹配前面的字符出现0次或多次

4.从哪查

代码功能
^匹配以某个字符串开头
$匹配以某个字符串结尾

5.综合代码

import re
if __name__ == '__main__':
# 匹配单个字符
# result = re.match(r".","abc123x中国yz")
# result = re.match(r"[0-9]","123x中国yz")
result = re.match(r"\d","123x中国yz")
print(result.group())
# 匹配多个字符
# result = re.match(r"\d+", "123x中国yz")
# result = re.match(r"\d*", "123x中国yz")
# result = re.match(r"\d?", "123x中国yz")
# 指定上限:次数<=n次,这里也就是必须是<=3个数字在一起
# result = re.match(r"\d{2}", "1aaa")
result = re.match(r"\d{2}", "123x中国yz")
# m<=次数<=n
# result = re.match(r"\d{1,3}", "123x中国yz")
print(result.group())
print("-"*50)
# 匹配开始和结束
# 开始
result = re.match(r"^\d","923abc")
# result = re.match(r"^\d","a923abc")
print(result.group())
# 结尾
result = re.match(r".*[a-z]$", "923abc")
print(result.group())
print("-" * 50)
# 开始+结束一起使用
result = re.match(r"^\d.*[a-z]$", "923abc")
print(result.group())

四、几个重要概念

1.子表达式

在正则表达式中,通过一对圆括号括起来的内容,我们就称之为==“子表达式”==,又称之为分组。

re.search(r'\d(\d)(\d)', 'abcdef123ghijklmn')
注意:Python正则表达式前的 r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。

正则表达式中\d\d\d中,(\d)(\d)就是子表达式,一共有两个()圆括号,则代表两个子表达式

说明:findall方法,如果pattern中有分组则返回与分组匹配的列表,所以分组操作中不适合使用findall方法,建议使用search(匹配一个)或finditer(匹配多个)方法。

2.捕获

当正则表达式在字符串中匹配到相应的内容后,计算机系统会自动把子表达式所匹配的到内容放入到系统的对应缓存区中(缓存区从$1开始)

在这里插入图片描述

案例演示:

import re
# 匹配字符串中连续出现的两个相同的单词
str1 = 'abcdef123ghijklmn'
result = re.search(r'\d(\d)(\d)', str1)
print(result.group())
print(result.group(1))
print(result.group(2))

3.反向引用

在正则表达式中,我们可以通过\n(n代表第n个缓存区的编号)来引用缓存区中的内容,我们把这个过程就称之为"反向引用"。

① 连续4个数字

re.search(r’\d\d\d\d, str1)

1234、5678、6789

② 连续的4个数字,但是数字的格式为1111、2222、3333、4444、5555效果?

re.search(r’(\d)\1\1\1, str1)

4.几个练习题

① 查找连续的四个数字,如:3569

答:\d{4}

② 查找连续的相同的四个数字,如:1111,2222, 3333, 4444
答:(\d)\1\1\1

③ 查找数字,如:1221,3443
答:(\d)(\d)\2\1

④ 查找字符,如:AABB,TTMM(提示:A-Z,正则:[A-Z])
答:([A-Z])\1([A-Z])\2

⑤ 查找连续相同的四个数字或四个字符(提示:\w)

答:(\w)\1\1\1

5.综合代码

import re
if __name__ == '__main__':
# | 管道符,匹配左右两个任意一个都行
# result = re.match(r"\d|\s","12 3")
result = re.match(r"\d|\s"," 123")
print(result.group())
print("-"*50)
# (正则表达式)
result = re.match(r"([a-z]+)([0-9]+)", "abcd12xyz")
print(result.group())
print("-" * 50)
# \分组ID:反向引用
"""
1- 在同一个正则表达式中,分组ID是唯一,而且序号从1开始数数
2- 每个分组的正则表达式必须使用()包起来
3- 反向引用不仅引用正则表达式的规则,而且内容需要保持一致
"""
# result = re.match(r"([a-z])\1([0-9])\2", "aa11")
# result = re.match(r"([a-z])\1\1([0-9])\2\2\2", "aaa1111")
result = re.match(r"([a-z])\1\1([0-9])\2\2\2\1\1", "aaa1111aa")
# 内容不相同的情况,不能够通过反向引用来进行匹配
# result = re.match(r"([a-z])\1\1([0-9])\2\2\2\1\1", "aab1111aa")
print(result.group())
print("-"*50)
# 代码层面:通过分组ID获取对应的内容
result = re.match(r"([a-z]+)([0-9]+)([a-z]+)", "ab123xyz")
print(result.group(1))
print(result.group(2))
print(result.group(3))
groups = result.groups()
print(groups,type(groups))

五、正则表达式其他方法

1.选择匹配符

|可以匹配多个规则

案例:匹配字符串hellojava或hellopython

2.分组别名

代码功能
(?P)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

案例:

import re
if __name__ == '__main__':
"""
分组取别名的注意实现:别名不能相同
"""
result = re.match(r"(?P<g_1>[a-z]+)(?P<g_2>[0-9]+)(?P<g_3>[a-z]+)", "ab123xyz")# result = re.match(r"(?P<g_1>[a-z]+)(?P<g_1>[0-9]+)(?P<g_3>[a-z]+)", "ab123xyz")print(result.group("g_1"))print(result.group("g_2"))print(result.group("g_3"))print("-"*50)# (了解)分组取别名的反向引用,注意后面的内容需要以前面的内容开头result = re.match(r"(?P<g_1>[a-z]+)(?P<g_2>[0-9]+)(?P=g_1)", "ab123ab")# result = re.match(r"(?P<g_1>[a-z]+)(?P<g_2>[0-9]+)(?P=g_1)", "ab123abc")# 这两种都无法匹配# result = re.match(r"(?P<g_1>[a-z]+)(?P<g_2>[0-9]+)(?P=g_1)", "ab123dabc")# result = re.match(r"(?P<g_1>[a-z]+)(?P<g_2>[0-9]+)(?P=g_1)", "ab123xyz")print(result.groups())print(result.group("g_1"))

3.综合案例

①需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配apple和pear

import re
list1 = ["apple", "banana", "orange", "pear"]
str1 = str(list1)
result = re.finditer(r'(apple|pear)', str1)
if result:
for i in result:
print(i.group())
else:
print('未匹配到任何数据')

② 需求:匹配出163、126、qq等邮箱

import re
email = '1478670@qq.com, go@126.com, hehe@163.com'
result = re.finditer(r'\w+@(qq|126|163).com', email)
if result:
for i in result:
print(i.group())
else:
print('未匹配到任何数据')

③需求 : 匹配qq:10567这样的数据,提取出来qq文字和qq号码

import re
str1 = 'qq:10567'
result = re.split(r':', str1)
if result:
print(f'{result[0]}号:{result[1]}')
else:
print('未匹配到任何数据')
http://www.jsqmd.com/news/378948/

相关文章:

  • 照着用就行:专科生专用降AI率软件,千笔·降AI率助手 VS PaperRed
  • 2026年全国面馆加盟权威榜单 解析核心优势 覆盖全场景创业需求 深耕品质与服务 - 深度智识库
  • 2026年口碑好的角行程执行器/执行器哪家靠谱制造厂家推荐 - 行业平台推荐
  • Nodejs+vue+ElementUI的协同过滤算法的旅游攻略管理系统express-mysql
  • 2026年质量好的宁波壁挂穿衣镜/穿衣镜厂家实力参考哪家质量好 - 行业平台推荐
  • 实用指南:慢接口调优过程
  • 2026国内靠谱分选机厂家排名情况,知名销售厂家揭秘,分选机/智能无损选果机/选果机/冬枣选果机,分选机企业哪家靠谱 - 品牌推荐师
  • Nodejs+vue+ElementUI的心理咨询预约测试平台的设计与实现express-mysql
  • 2026年比较好的电动球阀/宁波调节型电动球阀供应商采购指南怎么联系 - 行业平台推荐
  • Nodejs+vue+ElementUI的养老院服务推荐系统的设计与实现express-mysql
  • 2026年质量好的装饰镜/宁波网红装饰镜选哪家高口碑品牌参考 - 行业平台推荐
  • 2026年口碑好的扬州印刷/扬州彩盒印刷实力工厂参考哪家靠谱(高评价) - 行业平台推荐
  • Nodejs+vue+ElementUI的医院门诊处方管理系统express-mysql
  • AtCoder Beginner Contest竞赛题解 | ABC 421
  • Nodejs+vue+ElementUI的万事屋智能服务平台的 商城 商家 优惠卷8m7g6296express-mysql
  • 交稿前一晚!AI论文软件 千笔·专业论文写作工具 VS Checkjie,研究生必备神器!
  • Python 偏函数实战指南:用 functools.partial 让代码更优雅
  • 2026年靠谱的化妆品包装/电子包装哪家强生产厂家实力参考 - 行业平台推荐
  • 深入解析Linux内核电源管理:从CPUFreq到SoC挂起的全链路剖析
  • 导师推荐!AI论文网站 千笔·专业论文写作工具 VS 灵感ai,研究生专属神器!
  • 教育平台富文本编辑器粘贴Excel表格是否自动适配?
  • PNG 转 WebP 在线工具哪个好?几款实用网站对比推荐
  • bingle,一个小型搜索引擎项目第一阶段:根本实现(使用Trae自动编程)
  • 2026年质量好的扬州静音脚轮/扬州无磁脚轮实力厂家口碑参考口碑排行 - 行业平台推荐
  • 2026年知名的直线型堆垛机/Miniload堆垛机供应商推荐怎么联系(畅销) - 行业平台推荐
  • 2026年不可错过的电子取证源头厂家口碑推荐排行,光盘抛光修复工具/介质预检恢复取证工作台,电子取证实力厂家怎么选择 - 品牌推荐师
  • 跨平台网页编辑器处理PPT转存格式兼容性如何?
  • 时序数据库 TimechoDB V2.0.8 发布 | 新增 Object 数据类型、协变量预测等功能
  • 搭建k3s,一个轻量级的 Kubernetes 发行版
  • 2026年质量好的高压电缆/低压电缆源头厂家推荐帮我推荐几家 - 行业平台推荐