Python正则表达式、pip包管理与openpyxl操作指南
正则表达式模块 (re) 核心用法
Python 的 re 模块提供了强大的正则表达式支持,用于字符串的匹配、搜索和替换。以下是几种常用的核心方法:
import re
# 1. findall:查找所有匹配项,返回包含所有结果的列表
text_data = "apple 123 banana 456 apple 789"
matches_list = re.findall(r'apple', text_data)
print(matches_list) # 输出: ['apple', 'apple']
# 2. finditer:与 findall 类似,但返回一个迭代器,适合处理大文本以节省内存
matches_iter = re.finditer(r'\d+', text_data)
for match in matches_iter:
print(match.group()) # 依次输出: 123, 456, 789
# 3. search:扫描整个字符串,返回第一个成功的匹配对象
search_result = re.search(r'\d+', text_data)
if search_result:
print(search_result.group()) # 输出: 123
# 4. match:仅从字符串起始位置开始匹配,若开头不符合则返回 None
start_match = re.match(r'apple', text_data)
print(start_match.group() if start_match else "No match") # 输出: apple
# 5. compile:预编译正则表达式对象,提高多次执行相同匹配时的效率
compiled_pattern = re.compile(r'apple')
print(compiled_pattern.findall("apple pie and apple juice")) # 输出: ['apple', 'apple']
正则表达式进阶:分组与命名捕获
在复杂的匹配场景中,分组和命名捕获可以帮助我们精准提取目标子串。
# 普通分组与 findall 的优先级问题
raw_text = "2023-10-25 2023-11-30"
# 当存在捕获组时,findall 默认只返回组内的内容
print(re.findall(r'(\d{4})-(\d{2})-(\d{2})', raw_text))
# 输出: [('2023', '10', '25'), ('2023', '11', '30')]
# 使用非捕获组 (?:...) 取消分组优先级,返回完整匹配
print(re.findall(r'(?:\d{4})-(?:\d{2})-(?:\d{2})', raw_text))
# 输出: ['2023-10-25', '2023-11-30']
# search 中的分组提取
date_match = re.search(r'(\d{4})-(\d{2})-(\d{2})', raw_text)
print(date_match.group(0)) # 完整匹配: 2023-10-25
print(date_match.group(1)) # 第一个组: 2023
# 命名捕获组:为分组指定别名,提升代码可读性
named_match = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', raw_text)
print(named_match.group('year')) # 输出: 2023
print(named_match.group('month')) # 输出: 10
网络爬虫基础概念
- 互联网的本质:全球计算机网络互联的集合,旨在实现数据与资源的共享。
- 上网行为:客户端通过网络协议向服务器发起请求,获取并渲染资源的过程。
- 网络爬虫:通过编写程序模拟浏览器行为,自动化地向目标服务器发送请求、获取响应数据,并从中提取有价值信息的脚本。理论上,浏览器能访问的公开数据,爬虫均可获取。
Python第三方库管理 (pip)
Python 生态拥有丰富的第三方库,使用 pip 工具可以轻松进行包管理。
常用 pip 命令
# 安装指定模块及版本
pip install requests==2.28.1
# 卸载模块
pip uninstall requests
# 查看当前 Python 版本
python --version
# 列出所有已安装的第三方包
pip list
# 查看特定包的详细信息
pip show requests
解决下载缓慢与常见报错
默认情况下,pip 从官方 PyPI 仓库下载,国内访问可能较慢。可以通过 -i 参数指定国内镜像源来加速:
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
常见国内镜像源:
- 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
- 阿里云:http://mirrors.aliyun.com/pypi/simple/
- 腾讯云:http://mirrors.cloud.tencent.com/pypi/simple
常见错误处理:
- pip 版本过低:根据终端提示执行升级命令,如
python -m pip install --upgrade pip。 - Read timed out:网络波动导致超时,建议重试或切换更稳定的网络/镜像源。
- 永久配置镜像源:在用户目录下创建 pip 配置文件(Linux/Mac 为
~/.pip/pip.conf,Windows 为%APPDATA%\pip\pip.ini),写入[global]和index-url配置。
爬虫实战:数据抓取与正则提取
以下示例演示了如何使用 requests 获取网页内容,并结合 re 模块提取结构化数据。
import requests
import re
# 1. 发送网络请求获取网页源码 (此处以模拟的图书数据为例)
url = "http://example.com/books"
# response = requests.get(url)
# html_content = response.text
# 为避免频繁请求,这里使用本地模拟的 HTML 数据
html_content = """
<div class="book-item">
<h3 class="title">Python编程从入门到实践</h3>
<span class="author">Eric Matthes</span>
<span class="price">89.00</span>
</div>
<div class="book-item">
<h3 class="title">流畅的Python</h3>
<span class="author">Luciano Ramalho</span>
<span class="price">139.00</span>
</div>
"""
# 2. 编写正则表达式提取目标字段
titles = re.findall(r'<h3 class="title">(.*?)</h3>', html_content)
authors = re.findall(r'<span class="author">(.*?)</span>', html_content)
prices = re.findall(r'<span class="price">(.*?)</span>', html_content)
# 3. 整合数据并输出
for title, author, price in zip(titles, authors, prices):
print(f"书名: {title} | 作者: {author} | 价格: ¥{price}")
Excel自动化处理 (openpyxl)
openpyxl 是 Python 中用于读写 Excel 2010 及以上版本(.xlsx)文件的主流库。对于旧版 .xls 文件,通常需要借助 xlrd 和 xlwt。
# 安装 openpyxl
pip install openpyxl
openpyxl 核心操作演示
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
# 1. 初始化工作簿与工作表
workbook = Workbook()
default_sheet = workbook.active
default_sheet.title = "员工信息"
# 创建新的工作表并指定位置
summary_sheet = workbook.create_sheet("数据汇总", 0)
# 2. 写入数据
# 方式一:通过单元格坐标直接赋值
default_sheet['A1'] = "姓名"
default_sheet['B1'] = "部门"
default_sheet['C1'] = "薪资"
# 方式二:使用 cell 方法指定行列
default_sheet.cell(row=2, column=1, value="张三")
default_sheet.cell(row=2, column=2, value="研发部")
default_sheet.cell(row=2, column=3, value=15000)
# 方式三:批量追加行数据
employee_data = [
["李四", "市场部", 12000],
["王五", "人事部", 11000],
["赵六", "研发部", 16000]
]
for row_data in employee_data:
default_sheet.append(row_data)
# 3. 使用 Excel 公式
# 在 C6 单元格计算 C2 到 C5 的薪资总和
default_sheet['C6'] = '=SUM(C2:C5)'
# 4. 调整样式(可选)
for cell in default_sheet[1]:
cell.font = Font(bold=True, color="FFFFFF")
cell.alignment = Alignment(horizontal='center')
# 5. 保存文件
workbook.save("company_data.xlsx")