python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 正则表达式

Python 正则表达式从入门到实战(看完就能直接用在项目里)

作者:kcuwu.

本文介绍了Python正则表达式的基本概念、核心模块re及其常用方法match、search、findall,详细讲解了正则表达式基础语法、分组与分组引用、贪婪与非贪婪模式、修饰符等高级特性,并提供了一些实战案例,感兴趣的朋友跟随小编一起看看吧

注意:在常见符号前加个 \ 代表转义符
在日常编程中,文本处理是绕不开的场景:验证邮箱、手机号,提取网页中的链接,替换敏感词,分割日志内容…… 如果用原生字符串方法逐字判断,代码会又长又难维护。而正则表达式就是解决这类问题的「神器」,它用一套简洁的规则,就能实现复杂的文本匹配、提取、替换。
今天这篇博客,带你从零到一掌握 Python 正则表达式,覆盖核心语法、内置模块、实战案例,看完就能直接用在项目里!

一、什么是正则表达式?

正则表达式(Regular Expression,简称正则 / Regex,在 Python 中称为 Reg),是用于匹配字符串的规则公式
简单说:你写一段「规则」,正则引擎会拿着这段规则,去目标文本中找符合规则的内容
举个最简单的例子:
规则 \\d 代表「匹配一个数字」,用它去匹配字符串 python123,就能找到 1、2、3 三个数字。

二、Python 正则核心模块:re 模块

Python 自带正则处理工具 ——re**** 模块,无需额外安装,直接导入即可使用:

import re

01_re 模块 match 匹配方式

re\.match\(\)从字符串开头进行匹配的方法:

代码示例

import re
def get_data(result):
    if result:
        return result.group()
    return "匹配失败"
# 正确匹配:开头符合规则
res1 = re.match('python', 'python正则')
print(get_data(res1))  # python
# 错误匹配:开头不符合
res2 = re.match('python', '学习python正则')
print(get_data(res2))  # 匹配失败

02_re 模块 search 匹配方式

re\.search\(\)扫描整个字符串,找到第一个符合规则的内容就停止:

代码示例

import re
def get_data(result):
    if result:
        return result.group()
    return "匹配失败"
# 在任意位置查找数字
res = re.search('\d+', 'python123java456')
print(get_data(res))  # 123

03_re 模块 findall 匹配方式

re\.findall\(\)最常用方法:

代码示例

import re
# 提取所有数字
res = re.findall('\d+', '价格99元,折扣8折,库存100件')
print(res)  # ['99', '8', '100']

三、正则表达式基础语法

04_正则表达式匹配单个字符

匹配一个字符的核心规则:

符号含义
\.匹配除换行外任意一个字符
\\d匹配一个数字(0-9)
\\D匹配一个非数字
\\w匹配字母 / 数字 / 下划线
\\W匹配非字母 / 数字 / 下划线
\\s匹配空白字符(空格、制表符)
\\S匹配非空白字符
\[\]匹配括号内任意一个字符

代码示例

import re
# 匹配一个数字
print(re.findall('\d', 'a1b2c3'))  # ['1','2','3']
# 匹配a或b或c
print(re.findall('[abc]', 'a1b2c3'))  # ['a','b','c']

05_正则表达式匹配多个字符的规则

用于控制字符出现次数

符号含义
\*匹配 0 次或多次(贪婪)
\+匹配 1 次或多次(贪婪)
?匹配 0 次或 1 次
\{n\}匹配 n 次
\{n,m\}匹配 n~m 次

分支匹配 |

符号含义
``匹配左右任意一个表达式,满足其一即可

代码示例

import re
# 匹配 python 或 java
res = re.findall('python|java', '我学python和java')
print(res)  # ['python', 'java']

代码示例

import re
# +:至少1次
print(re.findall('\d+', 'abc123def45'))  # ['123','45']
# ?:0次或1次(匹配https中的s)
print(re.findall('https?', 'http://baidu.com'))  # ['http']

06_正则表达式匹配开头和结尾

用于精准锁定字符串边界,常用于格式验证:

符号含义
^匹配字符串开头
$匹配字符串结尾

代码示例

import re
# 验证手机号:必须以1开头,总共11位
def check_phone(phone):
    return re.match('^1[3-9]\d{9}$', phone) is not None
print(check_phone('13800138000'))  # True
print(check_phone('138001380'))    # False

四、分组与分组引用(高级核心)

1. 分组\( \)

符号含义
\(ab\)将括号中字符作为一个分组,整体匹配、方便提取

代码示例

import re
# 分组提取 姓名、年龄
text = "姓名:小明,年龄:18"
res = re.search('姓名:(\w+),年龄:(\d+)', text)
print(res.group(1))  # 小明(第1个分组)
print(res.group(2))  # 18(第2个分组)

2. 分组引用\\num

符号含义
\\num引用分组 num 匹配到的字符串,必须和分组内容一模一样
例如:\\1 引用第 1 个分组,\\2 引用第 2 个分组

代码示例(匹配重复单词)

import re
# 匹配连续重复的单词:hello hello
text = "hello hello world world"
res = re.findall(r'(\w+)\s+\1', text)
print(res)  # ['hello', 'world']

代码示例(匹配 HTML 成对标签)

import re
# 匹配 <div>正则</div> 这种成对标签
text = "<div>正则</div><p>python</p>"
res = re.findall(r'<(\w+)>.*?</\1>', text)
print(res)  # ['div', 'p']

五、正则贪婪与非贪婪模式

1. 贪婪模式(默认)

示例

import re
text = "<div>正则</div><div>Python</div>"
# 贪婪匹配:一口气匹配整个字符串
result = re.findall(r'<div>.*</div>', text)
print(result)
# ['<div>正则</div><div>Python</div>']

2. 非贪婪模式

示例

import re
text = "<div>正则</div><div>Python</div>"
# 非贪婪匹配:分别匹配两个标签
result = re.findall(r'<div>.*?</div>', text)
print(result)
# ['<div>正则</div>', '<div>Python</div>']

提取网页标签、JSON 内容时,几乎都用非贪婪模式

六、正则标志修饰符

修饰符可以全局改变正则匹配行为,放在 re\.match / search / findall 的第 3 个参数位置。

修饰符简写作用
re\.Ire\.IGNORECASE忽略大小写
re\.Sre\.DOTALL\. 匹配换行符 \\n
re\.Mre\.MULTILINE多行模式,^ $ 匹配每行开头结尾
re\.Xre\.VERBOSE允许正则写注释、换行,更易读

示例 1:忽略大小写

import re
res = re.findall(r'python', 'Python PYTHON python', re.I)
print(res)  # ['Python', 'PYTHON', 'python']

示例 2:让。匹配换行(re.S)

import re
text = "aa\nbb"
# 不加 re.S:. 不匹配\n,匹配失败
res1 = re.findall(r'aa.*bb', text)
print(res1)  # []
# 加 re.S:. 可以匹配\n,成功
res2 = re.findall(r'aa.*bb', text, re.S)
print(res2)  # ['aa\nbb']

示例 3:多行模式(re.M)

import re
text = "hello\nworld\npython"
# 每行开头匹配
res = re.findall(r'^\w+', text, re.M)
print(res)  # ['hello', 'world', 'python']

七、高频实战案例

# 验证邮箱
def check_email(email):
    return re.match('^\w+@\w+\.\w+$', email) is not None
# 提取链接
html = '<a href="https://www.baidu.com" rel="external nofollow" >百度</a>'
links = re.findall('https?://\S+', html)

八、新手避坑指南

总结

现在整篇博客已经完全包含你所有要补充的内容
贪婪 / 非贪婪 + 正则修饰符,结构清晰、顺序对应、可直接当完整教程使用。

到此这篇关于Python 正则表达式从入门到实战(看完就能直接用在项目里)的文章就介绍到这了,更多相关Python 正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文