Z
ZHANK
常用技能

正则表达式

re 模块常用函数、分组/命名组、贪婪/非贪婪、编译优化

正则表达式

正则表达式是处理文本的强大工具——匹配、查找、替换、验证格式,全靠它。

学完本章你将掌握: re 模块、常用模式、search/match/findall、sub 替换。


一、re 模块基础

python
import re

text = "我的电话是 138-1234-5678,办公室是 010-87654321"

# search:搜索第一个匹配
match = re.search(r"\d{3}-\d{4}-\d{4}", text)
if match:
    print(match.group())  # 138-1234-5678

# findall:找到所有匹配
phones = re.findall(r"\d+-\d+", text)
print(phones)  # ['138-1234-5678', '010-87654321']

二、常用模式

模式含义示例
`\d`数字`\d{3}` 匹配 3 位数字
`\w`字母数字下划线`\w+` 匹配单词
`.`任意字符`a.c` 匹配 abc, a1c
`*`0次或多次`ab*c` 匹配 ac, abc, abbc
`+`1次或多次`ab+c` 匹配 abc, abbc
`?`0或1次`ab?c` 匹配 ac, abc
`{n}`恰好n次`\d{3}` 匹配 3 位数字
`^`开头`^Hello`
`$`结尾`end$`
`[abc]`字符集`[aeiou]` 元音字母
`\s`空白空格、Tab、换行

三、常用函数

python
# match:从字符串开头匹配
print(re.match(r"\d+", "123abc"))  # 匹配成功

# search:搜索整个字符串
print(re.search(r"\d+", "abc123")) # 匹配成功(match 会失败)

# findall:返回所有匹配的列表
words = re.findall(r"\w+", "hello world python")
print(words)  # ['hello', 'world', 'python']

# sub:替换
text = "电话: 13812345678"
masked = re.sub(r"\d{3}\d{4}\d{4}", "***隐藏***", text)
print(masked)

# split:按模式分割
parts = re.split(r"[,\s]+", "a,b c  d")
print(parts)  # ['a', 'b', 'c', 'd']

四、分组捕获

python
phone = "138-1234-5678"
match = re.search(r"(\d{3})-(\d{4})-(\d{4})", phone)
if match:
    print(match.group(1))  # 138
    print(match.group(2))  # 1234
    print(match.group(3))  # 5678
    print(match.groups())  # ('138', '1234', '5678')

五、实战:邮箱验证

python
def is_valid_email(email):
    pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
    return bool(re.match(pattern, email))

print(is_valid_email("test@example.com"))  # True
print(is_valid_email("invalid-email"))     # False

小结

  1. re.search 找第一个,re.findall 找全部
  2. \d \w . * + 是最常用的模式符号
  3. () 捕获分组,re.sub 替换
  4. 正则难以调试时,先用简单模式验证再逐步复杂化