1. Python正则表达式实战:数据验证与匹配技巧
正则表达式是Python中处理字符串匹配的利器,在日常开发中常用于数据验证、文本提取等场景。这次作业通过四个典型例子展示了正则表达式的实际应用。
1.1 电话号码匹配解析
python复制import re
print(re.match("029-\d{5,8}$","029-12345")) #匹配陕西省区号
这个正则表达式用于验证陕西省固定电话号码格式:
029-:匹配区号部分,西安的区号固定为029\d{5,8}:匹配5到8位数字,这是国内固定电话的常见长度范围$:确保字符串在此结束,避免后面有多余字符
实际应用中需要注意:国内固定电话号码长度并非完全固定,有些特殊号码可能更短。如果用于生产环境,建议结合具体业务需求调整规则。
1.2 邮政编码验证实现
python复制print(re.match("\d{6}$","745100")) #匹配邮政编码
中国邮政编码的规则非常简单:
\d{6}:严格匹配6位数字$:确保没有多余字符
虽然规则简单,但在实际业务中,我们可能需要:
- 验证后存储时去除可能的空格
- 考虑用户可能输入带连字符的形式(如745-100)
- 结合地区数据库进行进一步验证
1.3 邮箱地址格式校验
python复制print(re.match("\w+@\w+\.\w+$","lijian@xianoupeng.com")) #匹配邮箱
这个基础版邮箱正则可以改进的地方很多:
\w+:匹配用户名部分,但实际允许的字符更多(如.+-等)@:分隔符\w+\.\w+:匹配域名,但实际域名规则更复杂
生产环境建议使用更完善的正则,如:
python复制^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
1.4 身份证号码验证
python复制print(re.match("\d{17}[x|\d|X]$","62282519960504337X")) #匹配身份证号
这个正则表达式验证18位身份证号:
\d{17}:前17位必须是数字[x|\d|X]:最后一位可以是数字或X(大小写均可)
实际项目中,我们还需要:
- 验证地区码(前6位)是否有效
- 验证生日部分(7-14位)是否为合法日期
- 计算校验位是否正确
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 网页内容抓取与图片链接提取
第二个作业展示了如何抓取网页内容并提取其中的图片链接,这是一个非常实用的网络爬虫基础案例。
2.1 网页请求与内容保存
python复制import requests
url = "https://www.scauzj.edu.cn/"
try:
res = requests.get(url)
print(type(res.text))
with open("hnnydxzjxy.txt","w",encoding="utf-8") as f:
f.write(res.text)
print("写入成功")
关键点解析:
requests.get():发送HTTP GET请求res.text:获取响应内容的文本形式- 文件操作使用
with语句,确保资源正确释放 - 指定
encoding="utf-8"避免编码问题
实际项目中,我们还需要考虑:
- 设置请求头(如User-Agent)
- 处理各种HTTP状态码
- 实现重试机制
- 遵守robots.txt规则
2.2 装饰器实现结果保存
python复制def save_to_file(func):
def wrapper(text):
paths = func(text)
with open("image_paths.txt","w",encoding="utf-8") as f:
for p in paths:
f.write(p+"\n")
print(f"路径已保存到文件")
return paths
return wrapper
这个装饰器实现了将函数结果保存到文件的功能:
- 接收一个函数
func作为参数 - 定义内部函数
wrapper处理实际逻辑 - 调用原始函数获取结果
- 将结果写入文件
- 返回原始结果,保持函数行为一致
2.3 图片链接提取实现
python复制@save_to_file
def get_images(text):
img_paths = re.findall(r'<img src=".*?".*?>',text)
return img_paths
图片提取的正则可以改进:
- 当前正则
<img src=".*?".*?>可能匹配到非src属性 - 更精确的写法:
<img[^>]*src="([^"]*)"[^>]*> - 提取结果可以进一步处理,转换为绝对URL
3. 正则表达式高级技巧与优化
3.1 正则表达式性能优化
- 预编译正则表达式:对于频繁使用的正则,先编译后使用
python复制phone_pattern = re.compile(r"029-\d{5,8}$")
print(phone_pattern.match("029-12345"))
- 使用非贪婪匹配:默认的
*和+是贪婪匹配,添加?变为非贪婪
python复制re.findall(r'<img src=".*?".*?>',text) # 贪婪
re.findall(r'<img src=".*?".*?>',text) # 非贪婪
- 合理使用锚点:
^和$可以显著提高匹配效率
3.2 常见正则表达式模式
- 匹配中文:
[\u4e00-\u9fa5] - 匹配URL:更复杂的模式需要考虑各种协议和特殊字符
- 匹配HTML标签:需要处理各种属性和嵌套情况
- 提取特定内容:如日期、金额、电话号码等
4. 爬虫开发中的注意事项
4.1 合法合规爬取
- 检查网站的robots.txt文件
- 设置合理的请求间隔
- 尊重版权和隐私
- 不要对服务器造成过大负担
4.2 异常处理与重试
完善的爬虫需要处理各种异常情况:
- 网络连接问题
- 请求超时
- HTTP错误状态码
- 页面解析失败
python复制try:
res = requests.get(url, timeout=5)
res.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 实现重试逻辑
4.3 反爬虫策略应对
常见反爬虫机制及应对方法:
- User-Agent检测:设置合理的请求头
- 频率限制:添加随机延迟
- 验证码:使用验证码识别服务或人工处理
- IP封禁:使用代理IP池
5. 项目扩展与实战建议
5.1 正则表达式测试工具
推荐使用在线工具测试和调试正则表达式:
- Regex101
- RegExr
- 各IDE内置的正则表达式测试功能
5.2 爬虫框架选择
对于更复杂的爬虫项目,可以考虑:
- Scrapy:功能完善的爬虫框架
- BeautifulSoup:HTML解析库
- Selenium:处理JavaScript渲染的页面
5.3 数据存储方案
爬取的数据可以考虑多种存储方式:
- 文本文件(如作业中的实现)
- CSV/Excel文件
- 数据库(MySQL、MongoDB等)
- 云存储服务
在实际项目中,我通常会先定义一个基类处理通用的请求、解析和存储逻辑,然后针对不同网站编写特定的解析器。这种架构既保证了代码复用,又能灵活应对各种网站结构。
