1 前言
正则表达式(Regular Expression,简称 Regex)是对字符串操作的一种逻辑公式,通过事先定义好的一些特定字符及其组合,组成一个'规则字符串',用来表达对字符串的过滤、匹配或替换逻辑。它是一种文本模式,描述在搜索文本时要匹配的一个或多个字符串。
本文详细介绍了 Python 正则表达式的基础知识与实战应用。内容涵盖正则表达式的基本概念、re 模块的核心函数(match、search、sub、findall 等)、特殊字符类与量语法的详细解析、分组与反向引用机制、编译优化技巧以及常用标志位的用法。文章通过代码示例演示了如何构建高效的文本匹配与替换逻辑,并提供了关于性能优化与安全性的最佳实践建议,旨在帮助开发者掌握利用正则表达式处理复杂字符串场景的能力。

正则表达式(Regular Expression,简称 Regex)是对字符串操作的一种逻辑公式,通过事先定义好的一些特定字符及其组合,组成一个'规则字符串',用来表达对字符串的过滤、匹配或替换逻辑。它是一种文本模式,描述在搜索文本时要匹配的一个或多个字符串。
在 Python 中,正则表达式的功能由内置的 re 模块提供。该模块使 Python 语言拥有全部的正则表达式功能,并提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串作为它们的第一个参数。
正则表达式广泛应用于爬虫数据抓取、日志分析、表单校验、文本清洗等场景。
re.match() 只从字符串的最开始与 pattern 进行匹配。如果字符串开头不匹配,即使后面有匹配内容也会返回 None。
语法:
re.match(pattern, string, flags=0)
参数说明:
pattern: 要匹配的正则表达式。string: 被搜索用于匹配字符串开头的模式。flags: 修饰符,可以使用按位 OR (|) 指定不同的标志,如 re.IGNORECASE。返回值:
成功时返回匹配对象,失败时返回 None。使用 group() 或 groups() 获取匹配的表达式。
示例:
import re
# 未从初始位置匹配,会返回 None
line = 'i can speak good english'
matchObj = re.match(r'\s(\w*)\s(\w*).*', line)
if matchObj:
print('matchObj.group() :', matchObj.group())
else:
print('no match!') # 输出:no match!
# 从初始位置开始匹配
matchObj = re.match(r'(i)\s(\w*)\s(\w*).*', line)
if matchObj:
print('matchObj.group() :', matchObj.group())
print('matchObj.group(1) :', matchObj.group(1))
print('matchObj.group(2) :', matchObj.group(2))
print('matchObj.group(3) :', matchObj.group(3))
re.search() 与 match() 工作方式类似,但它不是从最开始匹配,而是扫描整个字符串,查找第一次匹配的内容。
语法:
re.search(pattern, string, flags=0)
示例:
import re
line = 'i can speak good english'
matchObj = re.search('(.*) (.*?) (.*)', line)
if matchObj:
print('matchObj.group() :', matchObj.group())
print('matchObj.group(1) :', matchObj.group(1))
print('matchObj.group(2) :', matchObj.group(2))
print('matchObj.group(3) :', matchObj.group(3))
else:
print('no match!')
re.sub() 是正则表达式中最常用的函数之一,用于替换匹配到的子串。
语法:
re.sub(pattern, repl, string, count=0)
参数说明:
pattern: 正则表达式。repl: 替换后的字符串或函数。string: 原始字符串。count: 最大替换次数,默认为 0(替换所有)。示例:
import re
line = 'i can speak good english'
speak = re.sub(r'can', 'not', line)
print(speak) # 输出:i not speak good english
speak1 = re.sub(r'\s', '', line) # 替换所有空格
print(speak1) # 输出:ican speakgoodenglish
findall(): 返回包含所有非重叠匹配项的列表。finditer(): 返回一个迭代器,生成匹配对象。import re
line = 'abc123def456'
pattern = r'\d+'
matches = re.findall(pattern, line)
print(matches) # 输出:['123', '456']
for match in re.finditer(pattern, line):
print(match.group(), match.span())
字符类用于匹配一组字符中的任意一个。
[abc]: 匹配 a、b 或 c。[^abc]: 匹配除 a、b、c 以外的字符。[a-z]: 匹配小写字母。[A-Z0-9]: 匹配大写字母或数字。\d: 匹配任意数字,等价于 [0-9]。\D: 匹配任意非数字字符。\w: 匹配字母、数字或下划线,等价于 [a-zA-Z0-9_]。\W: 匹配非单词字符。\s: 匹配任意空白字符(空格、制表符、换行等)。\S: 匹配任意非空白字符。*: 匹配前一个字符 0 次或多次。+: 匹配前一个字符 1 次或多次。?: 匹配前一个字符 0 次或 1 次。{n}: 精确匹配 n 次。{n,}: 至少匹配 n 次。{n,m}: 匹配 n 到 m 次。默认情况下,量词是贪婪的(尽可能多地匹配)。添加 ? 可使其变为非贪婪(尽可能少地匹配)。
.*: 贪婪匹配任意字符。.*?: 非贪婪匹配任意字符。import re
text = '<div>content</div>'
print(re.search('<.*>', text).group()) # 输出:<div>content</div>
print(re.search('<.*?>', text).group()) # 输出:<div>
圆括号 () 用于分组,同时捕获匹配内容以便后续引用。
(abc): 捕获组。(?:abc): 非捕获组,仅分组不捕获。import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
match = re.match(pattern, '2023-10-01')
print(match.group(1)) # 2023
print(match.groups()) # ('2023', '10', '01')
在替换或匹配中引用之前捕获的组。
\1: 引用第一个捕获组。\g<1>: 更安全的引用方式。指定匹配的位置。
^: 匹配字符串开头。$: 匹配字符串结尾。\b: 匹配单词边界。import re
print(re.match('^Hello', 'Hello World')) # 匹配
print(re.search('World$', 'Hello World')) # 匹配
对于重复使用的正则表达式,建议使用 re.compile() 提高性能。
import re
pattern = re.compile(r'\d+')
result = pattern.findall('abc123def456')
print(result) # ['123', '456']
re.I / re.IGNORECASE: 忽略大小写。re.M / re.MULTILINE: 多行模式,^ 和 $ 匹配每行的首尾。re.S / re.DOTALL: 让 . 匹配包括换行符在内的所有字符。re.X / re.VERBOSE: 允许在正则表达式中添加注释和空格以提高可读性。import re
pattern = re.compile(r'^hello', re.I)
print(pattern.match('HELLO')) # 匹配
r''。re.VERBOSE 标志。Python 的 re 模块功能强大且灵活。掌握 match、search、sub 等核心函数,理解字符类、量词、分组及锚点的用法,能够高效解决绝大多数文本处理问题。在实际开发中,建议结合具体场景选择合适的匹配策略,并注意代码的可维护性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online