云计算百科
云计算领域专业知识百科平台

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

文章目录

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

前言

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

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

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

1.1 re.match():开头匹配

从字符串开头进行匹配,开头匹配成功则返回匹配对象,失败返回None。 语法:re.match(匹配规则, 被匹配字符串)

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。

import re

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

1.3 re.findall():查找全部

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

import re

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

1.4 re.sub():替换

将字符串中匹配到的内容替换为指定文本,返回替换后的新字符串。 语法:re.sub(匹配规则, 替换内容, 被匹配字符串)

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]。

示例:

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 位

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

import re

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

案例 3:提取 URL 链接

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

import re

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

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

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

import re

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

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

五、易错点总结

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

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

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Python 入门】Python 正则表达式零基础讲解:基础语法 + 元字符 + 常用案例
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!