Complete-Python-3-Bootcamp文本处理:正则表达式高级技巧
正则表达式(Regular Expression,简称Regex)是文本处理的强大工具,能够帮助开发者快速检索、匹配和替换字符串中的特定模式。在Complete-Python-3-Bootcamp项目中,[12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb](https://link.gitcode.com/i/1f9a40b193e8842dff63c894a6557c00/blob/ed69ec6b229de6b96a325f17be839a7eadeec60a/12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb?utm_source=gitcode_repo_files)详细介绍了正则表达式的基础语法与实战应用。本文将结合项目实例,深入讲解正则表达式的高级技巧,帮助你解决复杂文本处理问题。
正则表达式基础回顾
在学习高级技巧前,我们先回顾正则表达式的核心概念。正则表达式通过特殊字符(元字符)来定义匹配模式,常见元字符包括:
\d:匹配任意数字(0-9)\w:匹配字母、数字或下划线\s:匹配空白字符(空格、制表符、换行符).:匹配任意字符(除换行符外)*:匹配前一个字符0次或多次+:匹配前一个字符1次或多次?:匹配前一个字符0次或1次{n}:匹配前一个字符恰好n次{n,}:匹配前一个字符至少n次{n,m}:匹配前一个字符n到m次[]:匹配括号内的任意字符():分组匹配,可通过group()方法提取子串
基础匹配示例
在项目文档中,通过搜索电话号码的例子展示了基础匹配的用法:
import re
text = "My telephone number is 408-555-1234"
phone_pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})')
match = re.search(phone_pattern, text)
print(match.group()) # 输出:408-555-1234
print(match.group(1)) # 输出:408(提取区号)
这段代码使用\d{3}-\d{3}-\d{4}匹配电话号码格式,并通过分组提取了区号。更多基础用法可参考[12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb](https://link.gitcode.com/i/1f9a40b193e8842dff63c894a6557c00/blob/ed69ec6b229de6b96a325f17be839a7eadeec60a/12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb?utm_source=gitcode_repo_files)。
高级匹配技巧
1. 贪婪匹配与非贪婪匹配
正则表达式默认采用贪婪匹配(尽可能匹配最长的字符串),但有时需要非贪婪匹配(尽可能匹配最短的字符串)。例如,在HTML文本中提取标签内容:
贪婪匹配:
text = "<div>Python</div><div>Bootcamp</div>"
print(re.findall(r'<div>(.*)</div>', text)) # 输出:['Python</div><div>Bootcamp']
非贪婪匹配(在*后添加?):
print(re.findall(r'<div>(.*?)</div>', text)) # 输出:['Python', 'Bootcamp']
2. 零宽断言(前后瞻匹配)
零宽断言用于匹配字符串中的位置,而非具体字符,包括:
(?=pattern):正向先行断言(匹配pattern前的位置)(?!pattern):负向先行断言(匹配非pattern前的位置)(?<=pattern):正向后行断言(匹配pattern后的位置)(?<!pattern):负向后行断言(匹配非pattern后的位置)
示例:提取价格(数字前有$符号):
text = "Price: $19.99, Discount: $9.99, Tax: ¥5.00"
prices = re.findall(r'(?<=\$)\d+\.\d+', text)
print(prices) # 输出:['19.99', '9.99']
上述代码使用(?<=\$)匹配$符号后的位置,再提取数字部分。
3. 条件匹配与分支结构
使用|实现分支结构,匹配多个模式中的一个。例如,匹配邮箱地址(支持@gmail.com或@outlook.com):
email_pattern = re.compile(r'^[a-zA-Z0-9._%+-]+@(gmail|outlook)\.com$')
print(email_pattern.match("user@gmail.com")) # 匹配成功
print(email_pattern.match("user@qq.com")) # 匹配失败
4. 正则表达式修饰符
修饰符用于修改正则表达式的匹配行为,常见修饰符包括:
re.IGNORECASE(re.I):忽略大小写re.DOTALL(re.S):使.匹配换行符re.MULTILINE(re.M):使^和$匹配每行的开头和结尾
示例(忽略大小写):
text = "Python python PYTHON"
print(re.findall(r'python', text, re.IGNORECASE)) # 输出:['Python', 'python', 'PYTHON']
实战应用:文本清洗与提取
1. 提取PDF中的文本
项目中15-PDFs-and-Spreadsheets/01-Working-with-PDFs.ipynb介绍了如何使用PyPDF2提取PDF文本。结合正则表达式,可进一步清洗和提取关键信息:
import PyPDF2
import re
# 读取PDF文件
pdf_file = open("15-PDFs-and-Spreadsheets/Working_Business_Proposal.pdf", "rb")
reader = PyPDF2.PdfReader(pdf_file)
text = ""
for page in reader.pages:
text += page.extract_text()
# 提取所有邮箱地址
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
print(emails)
2. 处理CSV文件中的数据
在15-PDFs-and-Spreadsheets/00-Working-with-CSV-Files.ipynb中,可使用正则表达式清洗CSV数据中的非数字字符:
import re
# 清洗价格数据(去除$和,)
price = "$1,000.99"
clean_price = re.sub(r'[^\d.]', '', price)
print(clean_price) # 输出:1000.99
常见问题与解决方案
1. 匹配特殊字符
当需要匹配.、*、+等特殊字符时,需使用\转义:
text = "File name: report_v1.2.txt"
print(re.findall(r'report_v\d+\.\d+', text)) # 输出:['report_v1.2']
2. 避免过度匹配
使用非贪婪模式或具体边界限制匹配范围。例如,提取HTML中的链接:
html = '<a href="https://example.com">Link</a><a href="https://test.com">Test</a>'
links = re.findall(r'href="(.*?)"', html)
print(links) # 输出:['https://example.com', 'https://test.com']
3. 性能优化
对于大型文本,可通过以下方式优化正则表达式性能:
- 使用
re.compile()预编译正则表达式 - 减少回溯(如避免嵌套量词)
- 使用具体模式而非通配符
.
总结与扩展学习
本文介绍了正则表达式的高级技巧,包括贪婪/非贪婪匹配、零宽断言、条件匹配等,并结合项目实例展示了在PDF文本提取、CSV数据清洗等场景的应用。更多实战练习可参考:
- [12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb](https://link.gitcode.com/i/1f9a40b193e8842dff63c894a6557c00/blob/ed69ec6b229de6b96a325f17be839a7eadeec60a/12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb?utm_source=gitcode_repo_files):正则表达式基础与进阶
- 15-PDFs-and-Spreadsheets/02-PDFs-Spreadsheets-Puzzle.ipynb:PDF与Excel数据处理谜题
- 13-Web-Scraping/00-Guide-to-Web-Scraping.ipynb:结合正则表达式的网页爬取
掌握正则表达式将极大提升你的文本处理效率,建议通过项目中的练习[12-Advanced Python Modules/08-Advanced-Modules-Exercise/07-Advanced-Modules-Exercise-Puzzle.ipynb](https://link.gitcode.com/i/1f9a40b193e8842dff63c894a6557c00/blob/ed69ec6b229de6b96a325f17be839a7eadeec60a/12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/07-Advanced-Modules-Exercise-Puzzle.ipynb?utm_source=gitcode_repo_files)进一步巩固所学知识。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




