Python学习系列 -初探标准库之re库

系列文章目录

第一章 初始 Python
第二章 认识 Python 变量、类型、运算符
第三章 认识 条件分支、循环结构
第四章 认识 Python的五种数据结构
第五章 认识 Python 函数、模块
第六章 认识面向对象三大特性
第七章 初探标准库之os库
第八章 初探标准库之pathlib库
第九章 初探标准库之Shutil库
第十章 初探标准库之re库



文章开篇

Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!


Python其强大的标准库和丰富的第三方库,恰似一片生机勃勃的森林,为开发者们提供了源源不断的资源和支持;
在这片广袤的“森林”中,隐藏着许多Python标准库中的珍贵模块,如os、sys、re等;它们如同森林中的璀璨明珠,熠熠生辉,为开发者的工作提供着不可或缺的支持
在Python的生态系统中,有许多备受赞誉的第三方库,如NumPy、Pandas、openpyxl、requests、selenium、pyqt等,这些库如同森林中的珍稀物种,以其独特的功能和卓越的性能,助力开发者们更高效地完成工作;
无论是处理字符串、读写文件这样的基础任务,还是并发编程、数据分析等高级挑战,Python的标准库和三方库都能应对自如,满足各种需求;


正则表达式简介

正则表达式是一种通用的字符串处理工具,适用于所有的编程语言


正则表达式的常用规则


1.字符组

在同一个位置可能出现的各种字符组成的一个字符组,在正则表达式中使用[]表示

正则待匹配字符匹配结果说明
[0123456789]8True在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配
[0123456789]aFalse由于字符组中没有"a"字符,所以不能匹配
[0-9]7True也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z]sTrue同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]BTrue[A-Z]就表示所有的大写字母
[0-9a-fA-F]eTrue可以匹配数字,大小写形式的a~f,用来验证十六进制字符

2.字符
元字符匹配内容
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线
\s匹配任意的空白符
\d匹配数字
\n匹配一个换行符
\t匹配一个制表符
\b匹配一个单词的结尾
^匹配字符串的开始
$匹配字符串的结尾
\W匹配非字母或数字或下划线
\D匹配非数字
\S匹配非空白符
a|b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[…]匹配字符组中的字符
[^…]匹配除了字符组中字符的所有字符

3.量词
量词用法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

正则表达式的使用

. ^ $ 规则

正则匹配结果待匹配字符说明
a.?abacadabefacgad?表示重复零次或一次,即只匹配"a"后面一个任意字符。
a.*abefacgadabefacgad*表示重复零次或多次,即匹配"a"后面0或多个任意字符。
a.+abefacgadabefacgad+表示重复一次或多次,即只匹配"a"后面1个或多个任意字符。
a.{1,2}abeacgadabefacgad{1,2}匹配1到2次任意字符。

*** + ? { } 规则**

正则匹配结果待匹配字符说明
a.?abacadabefacgad?表示重复零次或一次,即只匹配"a"后面一个任意字符。
a.*abefacgadabefacgad*表示重复零次或多次,即匹配"a"后面0或多个任意字符。
a.+abefacgadabefacgad+表示重复一次或多次,即只匹配"a"后面1个或多个任意字符。
a.{1,2}abeacgadabefacgad{1,2}匹配1到2次任意字符。

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

正则待匹配字符匹配结果说明
a.*?abefacgada a a惰性匹配

字符集[][^]规则

正则待匹配字符匹配结果说明
a[befcgd]*abefacgadabefacgad表示匹配"a"后面[befcgd]的字符任意次`
a[^f]*abefacgadabeacgad表示匹配一个不是"f"的字符任意次
[\d]412a3bc4123表示匹配任意一个数字,匹配到4个结果
[\d]+412a3bc4123表示匹配任意个数字,匹配到2个结果

分组 ()与 或 |[^]规则
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x,下面我们尝试用正则来表示:

正则待匹配字符匹配结果说明
1\d{13,16}[0-9x]$110101198001017032110101198001017032表示可以匹配一个正确的身份证号
2\d{13,16}[0-9x]$11010119800101701101011980010170表示也可以匹配这串数字,但这并不是一个正确的身份证号码,它是一个16位的数字
3\d{14}(\d{2}[0-9x])?$1101011980010170False现在不会匹配错误的身份证号了()表示分组,将\d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$110105199812067023110105199812067023表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14}

转义符 \规则
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"“进行转义,变成’\'。
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次”\n",字符串中要写成’\n’,那么正则里就要写成"\\n",这样就太麻烦了。这个时候我们就用到了r’\n’这个概念,此时的正则是r’\n’就可以了。

正则待匹配字符匹配结果说明
\n\nFalse因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配
\n\nTrue转义\之后变成\,即可匹配
“\\n”‘\n’True如果在python中,字符串中的’‘也需要转义,所以每一个字符串’'又需要转义一次
r’\n’r’\n’True在字符串之前加r,让整个字符串不转义

贪婪匹配
在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

正则待匹配字符匹配结果说明
<.*><script>…<script><script>…<script>默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?><script>…<script><script><script>加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

几个常用的非贪婪匹配Pattern

正则说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

.*?规则的用法

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x

就是取前面任意长度的字符,直到一个x出现

re标准库简介

re模块是Python中用于匹配字符串的模块,基于正则表达式实现模糊匹配和提取特定字符串等功能。


re.compole方法

作用:编译正则表达式,生成一个正则表达式(Pattern)对象,提供findall、search、match等方法使用,这样可以多次使用该对象,无需重复编译,提高效率;
参数:

  • pattern: 正则表达式规则
  • flags:控制正则表达式的行为

以下是一些使用不同 flags 的示例:


# 示例 1:查找所有的数字
import re

text = "张三18岁,身高178cm,体重75kg"
pattern = re.compile(r'\d+')            # 将正则表达式预编译成Pattern对象
numbers = re.findall(pattern, text)     # 使用Pattern对象在text字符串中进行匹配

print("字符串中的数字:", numbers)  # 字符串中的数字: ['18', '178', '75']


# 示例 2:查找字符串中所有的单词(被符号分隔的中英文)
pattern = re.compile(r'\b\w+\b')        # 将正则表达式预编译成Pattern对象
text = "Hello world! 123456789@你好"
matches = re.findall(pattern, text)     # 使用Pattern对象在text字符串中进行匹配

print("字符串中的单词:", matches)  # 字符串中的单词: ['Hello', 'world', '123456789', '你好']

# 示例 3:查找字符串中所有的邮箱
pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')  # 将正则表达式预编译成Pattern对象
text = "我的邮箱是:10086@qq.com,你的邮箱是:10086@163.com"
matches = re.findall(pattern, text)
print("字符串中的邮箱号:", matches)     # 字符串中的邮箱号: ['10086@qq.com', '10086@163.com']


re.search

扫描字符串以查找正则表达式规则产生匹配项的第一个位置 ,然后返回相应的match对象。
参数:

  • pattern: 正则表达式规则
  • string:要匹配的字符串
  • flags:控制正则表达式的行为


import re

# 示例 1: 搜索字符串中的指定部分
text = "你的男朋友是一个盖世垃圾,他将脚踏七彩祥云迎娶你的闺蜜"
search = re.search("七彩祥云", text)

if search:
    print("找到匹配:", search.group())  # 找到匹配: 七彩祥云
else:
    print("未找到匹配")

# 示例 2: 使用正则表达式搜索数字
text = "张三18岁,身高178cm,体重75kg"
search = re.search("\d+", text)

if search:
    print("找到数字:", search.group())
else:
    print("为找到数字")


# 示例 3: 在字符串中搜索日期格式
pattern = re.compile(r'\d{4}-\d{2}-\d{2}')  # 匹配YYYY-MM-DD格式的日期
match = re.search(pattern, '日期:2024-02-25,天气:多云')  # 在字符串中搜索
if match:
    print("日期:", match.group()) # 日期: 2024-02-25


re.match

从字符串的开头开始匹配正则表达式模式,返回第一个匹配的对象;

  • pattern: 正则表达式规则
  • string:要匹配的字符串
  • flags:控制正则表达式的行为

# 示例 1: 匹配字符串开头
import re

text = "你的男朋友是一个盖世垃圾,他将脚踏七彩祥云迎娶你的闺蜜"
match1 = re.match("你的男朋友", text)
match2 = re.match("盖世垃圾", text)
# 匹配成功时
if match1:
    print("匹配文本:", match1.group())   # 匹配文本: 你的男朋友
else:
    print("未找到匹配")

# 匹配失败时
if match2:
    print("匹配文本:", match2.group())  # match2不成立,未执行此代码
else:
    print("未找到匹配")  # 未找到匹配


# 示例 2: 使用标志忽略大小写
import re

text = "python programming"
match = re.match("PYTHON", text, re.IGNORECASE)

if match:
    print("匹配文本:", match.group())
else:
    print("未找到匹配")

re.findall

在字符串中查找所有正则表达式模式的匹配项,并返回一个列表

  • pattern: 正则表达式规则
  • string:要匹配的字符串
  • flags:控制正则表达式的行为

# 示例 1:查找所有的数字
import re

text = "张三18岁,身高178cm,体重75kg"
pattern = re.compile(r'\d+')            # 将正则表达式预编译成Pattern对象
numbers = re.findall(pattern, text)     # 使用Pattern对象在text字符串中进行匹配

print("字符串中的数字:", numbers)  # 字符串中的数字: ['18', '178', '75']


# 示例 2:查找字符串中所有的单词(被符号分隔的中英文)
pattern = re.compile(r'\b\w+\b')        # 将正则表达式预编译成Pattern对象
text = "Hello world! 123456789@你好"
matches = re.findall(pattern, text)     # 使用Pattern对象在text字符串中进行匹配

print("字符串中的单词:", matches)  # 字符串中的单词: ['Hello', 'world', '123456789', '你好']

# 示例 3:查找字符串中所有的邮箱
pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')  # 将正则表达式预编译成Pattern对象
text = "我的邮箱是:10086@qq.com,你的邮箱是:10086@163.com"
matches = re.findall(pattern, text)
print("字符串中的邮箱号:", matches)     # 字符串中的邮箱号: ['10086@qq.com', '10086@163.com']


re.finditer

与findall方法用法一致,且本质上没有区别,一个返回列表,一个返回迭代器

import re

text = 'Does this text match the text pattern?'
matches1 = re.finditer('text', text)
print(matches1)  # <callable_iterator object at 0x0000024D0E9018D0>
for match in matches1:
    print(match, match.group())
    # <re.Match object; span=(10, 14), match='text'> text
    # <re.Match object; span=(25, 29), match='text'> text

matches2 = re.findall('text', text)
print(matches2)  # ['text', 'text']

re.sub

使用指定字符串替换所有正则表达式的匹配项,如果指定了count参数,则只替换前count个匹配项;

  • pattern: 正则表达式规则
  • repl: 替换匹配项的字符串
  • string:要匹配的字符串
  • count: 最大替换次数,默认为0(无限)
  • flags:控制正则表达式的行为

# 示例 1: 将张三的年龄使用**号隐藏
import re

text = "张三18岁,身高178cm,体重75kg"
pattern = re.compile(r'\d+')
replaced_text = re.sub(pattern, "**", text, 1)

print("替换后的文本:", replaced_text)  # 张三#岁,身高178cm,体重75kg


# 示例 2: 移除所有标点符号
text = "Hello, world! Python is fun."
pattern = re.compile(r"[,\.!]")

clean_text = re.sub(pattern, "", text)
print("清理后的文本:", clean_text)  # Hello world Python is fun

总结

Python的re模块是一个功能强大的正则表达式处理工具,提供了丰富灵活的方法,使开发者能轻松实现文本中的正则表达式匹配、搜索和替换等操作,满足各种文本处理需求,无论是简单分析还是复杂模式匹配。


  1. 1-9 ↩︎

  2. 1-9 ↩︎

  3. 1-9 ↩︎

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值