目录:
re 模块是一种强大的文本处理工具,通过定义特定模式来检查、搜索、替换或分割字符串。
从字符串开头匹配,适合检查字符串是否以特定模式开头。
常见的用途是验证用户输入或数据格式是否符合特定规范。
身份证号码通常为18位数字,最后一位可能是数字或大写字母X。
import re
def check_id(id_num):
pattern = r"^\d{17}(\d|X)$" # ^表示开头,\d{17}匹配17位数字,(\d|X)匹配数字或X,$表示结尾
result = re.match(pattern, id_num)
return bool(result)
print(check_id("370781199912011234")) # True
print(check_id("37078119991201123X")) # True
print(check_id("37078119991201123Y")) # False(最后一位不是X或数字)
利用括号 () 进行分组捕获,可以一次性提取多个相关部分。
import re
request_line = "GET /index.html HTTP/1.1"
match = re.match(r'^(GET|POST|PUT) (\S+) HTTP/(\d\.\d)$', request_line)
if match:
method, path, version = match.groups()
print(f"Method: {method}, Path: {path}, HTTP Version: {version}")
# 输出: Method: GET, Path: /index.html, HTTP Version: 1.1
与 match 不同,search 会扫描整个字符串并返回第一个成功的匹配。它不要求匹配从字符串开头开始。
import re
text = "订单编号2023XYZ,总计金额1500元。"
match = re.search(r'\d+', text) # 匹配一个或多个数字
if match:
print(f"找到的数字: {match.group()}") # 输出: 2023
利用括号 () 进行分组捕获,可以一次性提取多个相关部分。
import re
log_entry = "ERROR 2024-01-10 14:30:22 Connection timeout"
pattern = r'(\w+)\s+(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})\s+(.+)'
match = re.search(pattern, log_entry)
if match:
level, date, time, message = match.groups()
print(f"日志级别: {level}, 日期: {date}, 时间: {time}, 信息: {message}")
# 也可以通过.group(1), .group(2)等按索引访问
print(f"第一个分组内容: {match.group(1)}") # 输出: ERROR
查找字符串中所有与模式匹配的子串,并以列表形式返回。如果没有匹配项,则返回空列表。
import re
result = re.findall(r'\d+', 'ABC123def456')
print(result) # 输出: ['123', '456']
功能与 findall 类似,但返回的是一个迭代器,每次迭代产生一个匹配对象。这在处理大量匹配或需要获取每个匹配的详细信息(如位置)时非常有用。
import re
pattern = re.compile(r'\d+')
for match in pattern.finditer('ABC123def456'):
print(match.group(), match.span())
# 输出:
# 123 (3, 6)
# 456 (9, 12)
用于替换字符串中的匹配项。pattern 是匹配模式,repl 是替换字符串(也可以是函数),string 是原始字符串,count 指定最大替换次数(默认为0,表示全部替换)
import re
date = '2026-01-10'
result = re.sub(r'-', '/', date)
print(result) # 输出: 2026/01/10
根据匹配到的模式分割字符串,返回分割后的列表。
import re
# \s 空白字符;\s+ 匹配一个或多个空白字符
result = re.split(r'\s+', 'a b c')
print(result) # 输出: ['a', 'b', 'c']
要求整个字符串与模式完全匹配。如果整个字符串匹配成功,则返回匹配对象;否则返回 None。
import re
result = re.fullmatch(r'\w+@\w+\.(com|cn|edu)', 'alex@oldboyedu.com')
print(result) # 输出: <re.Match object; span=(0, 18), match='alex@oldboyedu.com'>
当 match、search 等函数匹配成功时,会返回一个 re.Match 对象。该对象提供了以下常用方法:
import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
date = '2023-09-07'
match = re.match(pattern, date)
if match:
print(match.group()) # 输出: 2023-09-07
print(match.group(1)) # 输出: 2023
print(match.groups()) # 输出: ('2023', '09', '07')
| 字符 | 功能描述 |
|---|---|
| . | 匹配除换行符外的任意单个字符(使用 re.S 标志时也能匹配换行符) |
| ^ | 匹配字符串的开头(多行模式下 re.M 也匹配每行开头) |
| $ | 匹配字符串的结尾(多行模式下 re.M 也匹配每行结尾) |
| * | 匹配前一个字符0次或多次(贪婪匹配) |
| + | 匹配前一个字符1次或多次(贪婪匹配) |
| ? | 匹配前一个字符0次或1次(贪婪匹配) |
| {m} | 匹配前一个字符恰好 m 次 |
| {m,n} | 匹配前一个字符 m 到 n 次 |
| *?, +?, ?? | 非贪婪匹配模式,匹配尽可能少的字符 |
| \d | 匹配数字,等价于 [0-9] |
| \D | 匹配非数字 |
| \w | 匹配字母、数字或下划线,等价于 [A-Za-z0-9_] |
| \W | 匹配非单词字符 |
| \s | 匹配空白字符(空格、制表符、换行符等) |
| \S | 匹配非空白字符 |
| […] | 匹配字符集合中的任意一个字符 |
| [^…] | 匹配不在字符集合中的任意一个字符 |
| ( … ) | 分组捕获,匹配括号内的表达式,并可在后续通过 \数字 或 group() 引用 |
| (?: … ) | 非捕获分组,匹配但不捕获该组 |
| (?P |
命名分组,可通过名称 name 引用该组 |
| \ | 转义特殊字符,使其失去特殊含义 |
↶ 返回首页 ↶