共计 1788 个字符,预计需要花费 5 分钟才能阅读完成。
在处理字符串和文本时,简单的查找或替换可能无法满足需求。这时我们可以使用正则表达式(Regular Expression,简称 regex)。正则表达式是一种强大的文本匹配工具,可以帮助我们快速查找、验证和替换特定模式的文本。Python 提供了 re 模块来支持正则表达式。
- 正则表达式基础语法
常见的正则表达式符号包括:
.:匹配任意一个字符(除换行符)。^:匹配字符串开头。$:匹配字符串结尾。*:匹配前一个字符 0 次或多次。+:匹配前一个字符 1 次或多次。?:匹配前一个字符 0 次或 1 次。{n}:匹配前一个字符恰好 n 次。{n,}:匹配前一个字符至少 n 次。{n,m}:匹配前一个字符 n 到 m 次。[]:匹配括号中的任意字符,例如[abc]表示匹配 a、b 或 c。\d:匹配数字,相当于[0-9]。\w:匹配字母、数字或下划线,相当于[a-zA-Z0-9_]。\s:匹配空白字符(空格、制表符、换行符等)。
- Python 中使用正则表达式
re模块是 Python 正则表达式的核心模块。常用函数包括:
re.match(pattern, string):从字符串开头匹配。re.search(pattern, string):扫描整个字符串,返回第一个匹配。re.findall(pattern, string):返回所有匹配结果的列表。re.sub(pattern, repl, string):替换匹配到的内容。
示例:
import re
# 匹配开头
result = re.match(r'Hello', 'Hello World')
print(result.group()) # 输出 Hello
# 搜索字符串
result = re.search(r'World', 'Hello World')
print(result.group()) # 输出 World
# 查找所有数字
numbers = re.findall(r'\d+', ' 我的手机号是 12345678,你的号码是 98765')
print(numbers) # 输出 ['12345678', '98765']
# 替换数字
text = re.sub(r'\d+', '***', ' 密码 1234 不要泄露 ')
print(text) # 输出 密码 *** 不要泄露
- 使用分组和捕获
我们可以用()在正则表达式中进行分组,方便提取指定内容。
import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = ' 今天的日期是 2025-09-15'
match = re.search(pattern, text)
if match:
print(" 年份:", match.group(1))
print(" 月份:", match.group(2))
print(" 日期:", match.group(3))
输出:
年份: 2025
月份: 09
日期: 15
- 预编译正则表达式
如果正则表达式需要多次使用,可以先编译,提高效率:
import re
pattern = re.compile(r'\d+')
print(pattern.findall(" 有 100 个苹果,200 个橙子 "))
- 实用案例
(1) 验证邮箱
import re
email = "[email protected]"
if re.match(r'^[\w.-]+@[\w.-]+\.\w+$', email):
print(" 合法邮箱 ")
else:
print(" 非法邮箱 ")
(2) 提取网址
import re
text = " 请访问 https://www.python.org 或 http://example.com"
urls = re.findall(r'https?://[a-zA-Z0-9./]+', text)
print(urls)
(3) 手机号脱敏
import re
phone = "13812345678"
safe_phone = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
print(safe_phone) # 输出 138****5678
总结:
正则表达式是文本处理中的利器,能够高效地完成查找、验证和替换等操作。熟练掌握 re 模块的使用,能大大提升我们在日志分析、数据清洗、文本处理等场景中的效率。
思考与练习:
- 写一个正则表达式验证身份证号码(18 位数字,最后一位可能是 X)。
- 编写一个程序提取 HTML 文本中的所有
<a>标签的超链接地址。 - 使用
re.sub实现文本中的敏感词替换功能。
正文完