正则表达式的高效应用

正则表达式的应用

正则表达式(Regular Expression,简称 Regex) 是处理字符串的“瑞士军刀”。它通过一套特定的规则(模式)来描述、匹配和处理符合特定特征的文本。在 Daoman Python AI 的网页爬虫、日志分析以及自动化办公脚本中,正则表达式是不可或缺的工具。

1. 正则表达式核心语法

正则表达式由普通字符(如字母 a)和元字符(如 \d)组成。元字符赋予了正则强大的描述能力。

常用元字符速查

符号解释示例匹配结果
.匹配除换行符外的任意字符b.tbat, b1t, b#t
\d匹配数字 [0-9]\d{3}123, 955
\w匹配字母、数字、下划线\w+python_3, hello
\s匹配任意空白符 (空格, \t, \n)love\syoulove you
^ / $匹配字符串的开头 / 结尾^The以 The 开头的行
[]匹配字符集中的任一字符[aeiou]任意元音字母
* / +重复 0 次或多次 / 1 次或多次\d+至少一个数字
?匹配 0 次或 1 次(或开启非贪婪模式)https?http 或 https

转义提示:如果要匹配正则中的特殊符号本身(如 .(),需要加反斜杠,写成 \.\(


2. Python 中的 re 模块

Python 通过内置的 re 模块提供对正则的支持。

核心函数功能说明
re.compile(pattern)预编译模式,提高多次调用时的效率。
re.match()从字符串开头开始匹配。
re.search()扫描整个字符串,寻找第一个匹配项。
re.findall()查找所有匹配项,返回字符串列表。
re.sub()替换匹配到的字符串。
re.split()根据正则模式拆分字符串。

3. 实战案例演示

案例 1:数据清洗(敏感词过滤)

利用 re.sub 可以轻松实现关键词屏蔽,并通过 re.IGNORECASE 忽略大小写。

import re

text = "Oh, Shit! 你是傻逼吗? Fuck you."
# 使用 | 表示“或”,[] 表示字符集
pattern = r'fuck|shit|[傻煞沙][比笔逼叉缺]'
# 替换为星号,忽略大小写
clean_text = re.sub(pattern, '*', text, flags=re.I)
print(clean_text)  # Oh, *! 你是*吗? * you.

案例 2:信息提取(手机号识别)

使用 re.findall 从杂乱的文本中提取符合特征的数据。

import re

sentence = "我的电话是 13512345678,不是 110,王总的是 15688889999。"
# 简单的手机号模式:1 开头,第二位是 3-9,后面跟着 9 位数字
phone_pattern = r'1[3-9]\d{9}'
phones = re.findall(phone_pattern, sentence)
print(phones)  # ['13512345678', '15688889999']

案例 3:复杂拆分(多分隔符)

当字符串中有多种标点符号需要拆分时,str.split 无法胜任,但正则可以。

import re

data = "Python,Java;Go  C++|Rust"
# 匹配逗号、分号、竖线或一个以上的空格
parts = re.split(r'[,;\|\s]+', data)
print(parts)  # ['Python', 'Java', 'Go', 'C++', 'Rust']

4. 贪婪与非贪婪匹配

这是初学者最容易掉坑的地方:

  • 贪婪模式(默认):尽可能多地匹配。
  • 非贪婪模式(加 ?:尽可能少地匹配。
text = "<div>内容1</div><div>内容2</div>"

# 贪婪模式:会匹配从第一个 <div> 到最后一个 </div>
print(re.findall(r'<div>.*</div>', text)) 
# ['<div>内容1</div><div>内容2</div>']

# 非贪婪模式:遇到第一个 </div> 就停止
print(re.findall(r'<div>.*?</div>', text)) 
# ['<div>内容1</div>', '<div>内容2</div>']

总结

  • 原始字符串 (r''):写正则时务必在引号前加 r,避免 Python 转义字符与正则转义冲突。
  • 预编译:如果一个正则要在循环中使用上千次,请先用 re.compile()
  • 工具推荐:建议使用在线工具(如 regex101.com)进行可视化调试。