正则表达式是Python中处理字符串匹配的利器,在日常开发中常用于数据验证、文本提取等场景。这次作业通过四个典型例子展示了正则表达式的实际应用。
python复制import re
print(re.match("029-\d{5,8}$","029-12345")) #匹配陕西省区号
这个正则表达式用于验证陕西省固定电话号码格式:
029-:匹配区号部分,西安的区号固定为029\d{5,8}:匹配5到8位数字,这是国内固定电话的常见长度范围$:确保字符串在此结束,避免后面有多余字符实际应用中需要注意:国内固定电话号码长度并非完全固定,有些特殊号码可能更短。如果用于生产环境,建议结合具体业务需求调整规则。
python复制print(re.match("\d{6}$","745100")) #匹配邮政编码
中国邮政编码的规则非常简单:
\d{6}:严格匹配6位数字$:确保没有多余字符虽然规则简单,但在实际业务中,我们可能需要:
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,}$
python复制print(re.match("\d{17}[x|\d|X]$","62282519960504337X")) #匹配身份证号
这个正则表达式验证18位身份证号:
\d{17}:前17位必须是数字[x|\d|X]:最后一位可以是数字或X(大小写均可)实际项目中,我们还需要:
第二个作业展示了如何抓取网页内容并提取其中的图片链接,这是一个非常实用的网络爬虫基础案例。
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规则
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处理实际逻辑python复制@save_to_file
def get_images(text):
img_paths = re.findall(r'<img src=".*?".*?>',text)
return img_paths
图片提取的正则可以改进:
<img src=".*?".*?>可能匹配到非src属性<img[^>]*src="([^"]*)"[^>]*>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) # 非贪婪
^和$可以显著提高匹配效率[\u4e00-\u9fa5]完善的爬虫需要处理各种异常情况:
python复制try:
res = requests.get(url, timeout=5)
res.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 实现重试逻辑
常见反爬虫机制及应对方法:
推荐使用在线工具测试和调试正则表达式:
对于更复杂的爬虫项目,可以考虑:
爬取的数据可以考虑多种存储方式:
在实际项目中,我通常会先定义一个基类处理通用的请求、解析和存储逻辑,然后针对不同网站编写特定的解析器。这种架构既保证了代码复用,又能灵活应对各种网站结构。