【Python 入门】Python 正则表达式零基础讲解:基础语法 + 元字符 + 常用案例

文章目录

  • 前言
  • [一、正则表达式基础:re 模块三大方法](#一、正则表达式基础:re 模块三大方法)
    • [1.1 `re.match()`:开头匹配](#1.1 re.match():开头匹配)
    • [1.2 `re.search()`:查找第一个](#1.2 re.search():查找第一个)
    • [1.3 `re.findall()`:查找全部](#1.3 re.findall():查找全部)
    • [1.4 `re.sub()`:替换](#1.4 re.sub():替换)
  • 二、元字符匹配规则
    • [2.1 单字符匹配](#2.1 单字符匹配)
    • [2.2 数量匹配](#2.2 数量匹配)
    • [2.3 边界匹配](#2.3 边界匹配)
    • [2.4 分组与选择](#2.4 分组与选择)
    • [2.5 关于`r`前缀](#2.5 关于r前缀)
  • 三、案例演示
    • [案例 1:账号校验](#案例 1:账号校验)
    • [案例 2:QQ 号校验](#案例 2:QQ 号校验)
    • [案例 3:提取 URL 链接](#案例 3:提取 URL 链接)
    • [案例 4:手机号校验](#案例 4:手机号校验)
  • 四、进阶优化:预编译正则
  • 五、易错点总结
  • 六、总结

前言

正则表达式是处理字符串的强大工具,通过特殊的字符序列,可以快速完成字符串的匹配、查找、替换、校验 等操作,在爬虫、数据清洗、表单验证等场景中非常常用。本文从 Python 的re模块基础讲起,系统梳理元字符规则,并搭配实战案例,带你快速掌握正则表达式。

一、正则表达式基础:re 模块三大方法

Python 通过内置的re模块使用正则表达式,核心有三个基础匹配方法。

1.1 re.match():开头匹配

从字符串开头 进行匹配,开头匹配成功则返回匹配对象,失败返回None

语法:re.match(匹配规则, 被匹配字符串)

python 复制代码
import re

s = "python linux"
result = re.match("python", s)
print(result)           # <re.Match object; span=(0, 6), match='python'>
print(result.group())   # 获取匹配到的内容:python
print(result.span())    # 获取匹配下标范围:(0, 6)

注意:只要开头不匹配,即使后面有符合规则的内容,也返回 None。

1.2 re.search():查找第一个

搜索整个字符串,找到第一个匹配项就停止,返回匹配对象;找不到返回 None。

python 复制代码
import re

s = "1python 123456python44"
result = re.search("python", s)
print(result)  # <re.Match object; span=(1, 7), match='python'>

1.3 re.findall():查找全部

匹配整个字符串,找出所有符合规则的内容,返回列表;找不到返回空列表[]

python 复制代码
import re

s = "1python 123456python44"
result = re.findall("python", s)
print(result)  # ['python', 'python']

1.4 re.sub():替换

将字符串中匹配到的内容替换为指定文本,返回替换后的新字符串。

语法:re.sub(匹配规则, 替换内容, 被匹配字符串)

python 复制代码
import re

s = "python java python c++"
new_s = re.sub("python", "Python", s)
print(new_s)  # Python java Python c++

二、元字符匹配规则

元字符是正则表达式中具有特殊含义的字符,是正则的核心语法。下面分类讲解常用元字符。

2.1 单字符匹配

元字符 功能说明
. 匹配任意 1 个字符(除了换行符\n
[] 匹配括号内列举的任意一个字符,如[a-z]匹配小写字母
\d 匹配数字,等价于[0-9]
\D 匹配非数字
\s 匹配空白字符(空格、tab、换行等)
\S 匹配非空白字符
\w 匹配单词字符(字母、数字、下划线)
\W 匹配非单词字符

注意:\d默认匹配 Unicode 数字,如需严格匹配 0-9,可加re.ASCII标志或直接写[0-9]

示例:

python 复制代码
import re

s = "python##@@python2!!  666###"
# 找出所有数字
print(re.findall(r"\d", s))  # ['2', '6', '6', '6']
# 找出所有非单词特殊字符
print(re.findall(r"\W", s)) # ['#', '#', '@', '@', '!', '!', ' ', ' ', '#', '#', '#']
# 找出所有英文字母
print(re.findall(r"[a-zA-Z]", s)) # ['p', 'y', 't', 'h', 'o', 'n', 'p', 'y', 't', 'h', 'o', 'n']

2.2 数量匹配

控制前面的字符出现的次数:

元字符 功能说明
* 匹配前一个字符出现 0 次或多次
+ 匹配前一个字符出现 1 次或多次
? 匹配前一个字符出现 0 次或 1 次
{m} 匹配前一个字符恰好出现 m 次
{m,} 匹配前一个字符至少出现 m 次
{m,n} 匹配前一个字符出现 m 到 n 次

补充:默认是贪婪匹配 (尽可能多匹配),在量词后加?变为非贪婪匹配(尽可能少匹配),如*?+?{m,n}?

2.3 边界匹配

元字符 功能说明
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配单词边界
\B 匹配非单词边界

2.4 分组与选择

元字符 功能说明
` `
(...) 将括号内内容作为一个分组,可提取匹配内容
(?:...) 非捕获分组,只做整体匹配,不单独保存分组内容

2.5 关于r前缀

正则表达式中经常出现\d\s等转义字符,在字符串前加r表示原始字符串 ,可以避免 Python 字符串转义和正则转义的冲突,写正则时建议统一加r前缀。

三、案例演示

案例 1:账号校验

要求:只能由字母和数字组成,长度 6~10 位

python 复制代码
import re

account = "aa3456789"
rule = r"^[a-zA-Z0-9]{6,10}$"
result = re.findall(rule, account)
print(result)  # 匹配成功返回['aa3456789'],失败返回[]

案例 2:QQ 号校验

要求:纯数字,长度 5-11 位,第一位不能为 0

python 复制代码
import re

qq = "2929409481"
rule = r"^[1-9][0-9]{4,10}$"
print(re.findall(rule, qq)) # ['2929409481']

案例 3:提取 URL 链接

python 复制代码
import re

text = "配网页地址ssshttps://sc.chinaz.com/tupian/index_1.html配网页地址"
rule = r"https?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\)]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
urls = re.findall(rule, text)
print(urls)  # ['https://sc.chinaz.com/tupian/index_1.html']

案例 4:手机号校验

要求:11 位数字,1 开头,第二位 3-9

python 复制代码
import re

phone = "13812345678"
rule = r"^1[3-9]\d{9}$"
print(re.match(rule, phone) is not None)  # True

四、进阶优化:预编译正则

如果同一个正则规则需要多次使用,用re.compile()预编译,可以提升运行效率:

python 复制代码
import re

# 预编译
pattern = re.compile(r"\d+")

# 多次使用
print(pattern.findall("abc123def456"))
print(pattern.findall("hello789world"))

五、易错点总结

  1. match 和 search 混淆match 只匹配开头,search 匹配整个字符串找第一个
  2. 忘记加 r 前缀:导致转义字符冲突,匹配结果不符合预期
  3. 贪婪匹配陷阱 :默认贪婪匹配会尽可能多匹配,需要精准匹配时记得加?转为非贪婪
  4. ^$的使用:做整体校验时必须加开头和结尾符,否则只要字符串包含符合规则的内容就会匹配成功
  5. 分组提取 :使用(...)分组后,findall会只返回分组内容,如需返回完整匹配可使用非捕获分组(?:...)

六、总结

  • 基础方法:match开头匹配、search找第一个、findall找全部、sub替换
  • 元字符四大类:单字符、数量、边界、分组
  • 实战核心:搭配^$做格式校验,用findall做数据提取
  • 优化技巧:高频使用的正则用compile预编译,统一使用r前缀避免转义问题

正则表达式语法丰富,入门阶段先掌握以上核心内容,后续可以在实际场景中逐步积累更复杂的用法。

相关推荐
weixin1997010801642 分钟前
《大促护航:电商API限流与降级,双11峰值500万调用的架构复盘》(附Python源码)
python·架构·wpf
2601_9578838444 分钟前
2026年8月:华硕笔记本维修相关信息
python·电脑
lzqrzpt1 小时前
临沂LED驱动电源工程选型与直销工厂评估标准解析
python·单片机·嵌入式硬件
老郑聊AI业财智造1 小时前
给大模型装上“金融之眼”:Kronos-Report的量化预测架构与技术全景剖析
人工智能·python·深度学习·语言模型·金融·架构·软件工程
deli0070071 小时前
正则表达式可视化测试工具:输入即匹配,高亮一目了然
git·测试工具·正则表达式
问天_观心1 小时前
深入学习Transformer(一)
人工智能·python·深度学习·神经网络·学习·transformer
雷帝木木1 小时前
DVC数据版本控制实战:让训练数据像代码一样可追溯
人工智能·python·深度学习·机器学习
月光船幽幽1 小时前
五层探针的哲学跃迁
人工智能·python
阿图灵2 小时前
OpenCV 轮廓与属性:查找轮廓、面积周长、形状拟合与点测试
图像处理·人工智能·python·opencv·计算机视觉·轮廓