Python 正则表达式语法与使用指南
1. 正则表达式基础语法
1.1 字符与字符类
1.1.1 特殊字符
以下字符在正则中具有特殊含义,如需匹配字面值需进行转义:^, $, , , , , , , , , , ,
Python 正则表达式用于文本模式匹配。本文涵盖字符类、量词、分组、断言及标志位等核心语法,详解 re 模块的 compile、search、match、findall、sub 及 split 方法。通过实际代码示例展示捕获组、反向引用及多行匹配技巧,帮助开发者高效处理字符串解析任务。

以下字符在正则中具有特殊含义,如需匹配字面值需进行转义:^, $, , , , , , , , , , ,
.?+*{}|()[\[] 中的一个或多个字符被称为字符类。若未指定量词,默认只匹配其中一个。[a-zA-Z0-9] 表示 a 到 z、A 到 Z、0 到 9 之间的任意字符。^ 表示否定,如 [^0-9] 表示匹配任意非数字字符。^, -, ], 外,其他特殊字符无特殊意义。^ 放首位表否定,- 放中间表范围,[ 放首位表本身。.:匹配除换行符外的任何字符(re.DOTALL 标志下包含换行)。\d:匹配 Unicode 数字(re.ASCII 下为 0-9)。\D:匹配 Unicode 非数字。\s:匹配 Unicode 空白字符(re.ASCII 下为空格、制表符等)。\S:匹配 Unicode 非空白。\w:匹配 Unicode 单词字符(re.ASCII 下为 [a-zA-Z0-9_])。\W:匹配 Unicode 非单词字符。?:匹配前面的字符 0 次或 1 次。*:匹配前面的字符 0 次或多次。+:匹配前面的字符 1 次或多次。{m}:匹配前面表达式 m 次。{m,}:匹配前面表达式至少 m 次。{,n}:匹配前面表达式最多 n 次。{m,n}:匹配前面表达式至少 m 次,最多 n 次。注意:以上量词默认为贪婪模式。改为非贪婪模式需在量词后加 ?,如 *?, +?, {m,n}?。
?: 可关闭捕获功能,仅用于分组。|。?: 的小括号分配一个组号(从 1 开始)。通过 \i 引用前文捕获内容。(?P<name>...) 命名组,通过 (?P=name) 引用。例如 (?P<word>\w+) \s+ (?P=word) 匹配重复单词。注意:反向引用不能在字符类 [] 中使用。
断言不消耗文本,仅对位置施加约束。
\b:单词边界。\B:非单词边界。\A:字符串起始处。^:起始处(MULTILINE 模式下每行开头)。\Z:字符串结尾处。$:结尾处(MULTILINE 模式下每行结尾)。(?=e):正前瞻(后面紧跟 e)。(?!e):负前瞻(后面不跟 e)。(?<=e):正回顾(前面是 e)。(?<!e):负回顾(前面不是 e)。示例:查找 hello 但后面必须是 world:
import re
pattern = r"hello\s+(?=world)"
text = "hello world"
print(re.search(pattern, text)) # 匹配成功
(?(id)yes_exp|no_exp):若 id 对应的子表达式匹配成功则匹配 yes_exp,否则匹配 no_exp。
re.compile(r"...", re.IGNORECASE | re.MULTILINE)。(?ms)#[da-z]{6}。re.A / re.ASCII:使 \d, \s, \w 等仅匹配 ASCII。re.I / re.IGNORECASE:忽略大小写。re.M / re.MULTILINE:多行匹配,^ 和 $ 匹配每行首尾。re.S / re.DOTALL:. 匹配包括换行符在内的所有字符。re.X / re.VERBOSE:允许跨行注释和空白,需用 \s 表示空格。re.compile() 生成对象后可复用,适合复杂或多次使用的场景。re.match(), re.search() 等,适合单次使用。返回列表。若无分组,含所有匹配项;若有分组,每项为元组(仅含分组内容)。
import re
rx = re.compile(r"(\d+)")
s = "abc123def456"
result = rx.findall(s)
print(result) # ['123', '456']
返回可迭代对象,每次迭代返回 Match 对象。可调用 group() 查看内容。
返回第一个匹配对象,未匹配返回 None。只匹配一次。
match = re.search(r"\d+", "abc123")
if match:
print(match.group()) # 123
仅在字符串起始处匹配,否则返回 None。
替换匹配内容。x 可为字符串或函数。支持 \g<name> 引用捕获组。
res = re.sub(r"\d+", "X", "price: 100")
print(res) # price: X
按正则分割字符串。若存在分组,分组内容也会插入返回列表中。
rx = re.compile(r"(\d)")
s = "ab12dk3"
result = rx.split(s)
print(result) # ['ab', '1', '2', 'dk', '3']
group(g): 获取第 g 组内容,默认 0 为整体。groupdict(): 返回命名组字典。groups(): 返回所有捕获组的元组。start(g), end(g): 获取匹配起止位置。span(): 返回 (start, end) 元组。string: 原始匹配字符串。email_pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
test_email = "[email protected]"
if re.match(email_pattern, test_email):
print("Valid Email")
text = "Contact me at 13800138000 or 13900139000"
pattern = r"1[3-9]\d{9}"
phones = re.findall(pattern, text)
print(phones) # ['13800138000', '13900139000']
search/match 返回值是否为 None 实现。search/match,多次遍历用 finditer。sub,支持函数处理逻辑。re.VERBOSE 编写可读性强的复杂正则。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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