Complete-Python-3-Bootcamp文本处理:正则表达式高级技巧

Complete-Python-3-Bootcamp文本处理:正则表达式高级技巧

【免费下载链接】Complete-Python-3-Bootcamp Course Files for Complete Python 3 Bootcamp Course on Udemy 【免费下载链接】Complete-Python-3-Bootcamp 项目地址: https://gitcode.com/GitHub_Trending/co/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.IGNORECASEre.I):忽略大小写
  • re.DOTALLre.S):使.匹配换行符
  • re.MULTILINEre.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/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)进一步巩固所学知识。

项目logo

【免费下载链接】Complete-Python-3-Bootcamp Course Files for Complete Python 3 Bootcamp Course on Udemy 【免费下载链接】Complete-Python-3-Bootcamp 项目地址: https://gitcode.com/GitHub_Trending/co/Complete-Python-3-Bootcamp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值