怎么让网站收录,电销外呼系统,济南网站搭建公司,wordpress登录安全插件下载Python3 正则表达式#xff1a;文本处理的魔法工具 内容简介
本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南#xff0c;旨在帮助读者从基础入门到项目实战#xff0c;全面提升编程能力。文章结构由 5 个版块组成#xff0c;内容层层递进#xff0c;逻…Python3 正则表达式文本处理的魔法工具 内容简介
本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南旨在帮助读者从基础入门到项目实战全面提升编程能力。文章结构由 5 个版块组成内容层层递进逻辑清晰。
基础速通n 个浓缩提炼的核心知识点夯实编程基础经典范例10 个贴近实际的应用场景深入理解 Python3 的编程技巧和应用方法避坑宝典10 个典型错误解析提供解决方案帮助读者避免常见的编程陷阱水平考试10 道测试题目检验学习成果附有标准答案以便自我评估实战案例3 个迷你项目开发带领读者从需求分析到代码实现掌握项目开发的完整流程。
无论你是 Python3 初学者还是希望提升实战能力的开发者本系列文章都能为你提供清晰的学习路径和实用的编程技巧助你快速成长为 Python3 编程高手。 阅读建议
初学者建议从 “基础速通” 开始系统学习 Python3 的基础知识然后通过 “经典范例” 和 “避坑宝典” 加深理解最后通过 “水平考试” 和 “实战案例” 巩固所学内容有经验的开发者可以直接跳转到 “经典范例” 和 “避坑宝典”快速掌握 Python3 的高级应用技巧和常见错误处理方法然后通过 “实战案例” 提升项目开发能力选择性学习如果读者对某个特定主题感兴趣可以直接选择相应版块学习。各版块内容既相互独立又逻辑关联方便读者根据自身需求灵活选择测试与巩固完成每个版块的学习后建议通过 “水平考试” 检验学习效果并通过 “实战案例” 将理论知识转化为实际技能项目实战优先如果你更倾向于实战学习可以直接从 “实战案例” 入手边做边学遇到问题再回溯相关知识点。 一、基础速通
正则表达式Regular Expression简称 regex 或 regexp是一种强大的工具用于匹配和处理文本。Python 通过 re 模块提供了对正则表达式的支持。正则表达式可以用于搜索、替换、分割和验证字符串。
1. 基本概念
模式Pattern正则表达式的核心是模式它定义了你要匹配的文本规则。元字符Metacharacters在正则表达式中具有特殊意义的字符如 ., *, , ?, ^, $, \, |, {, }, [, ], (, ) 等。普通字符除了元字符之外的字符如字母、数字等。
2. 常用元字符
.匹配除换行符以外的任意单个字符。^匹配字符串的开头。$匹配字符串的结尾。*匹配前面的字符零次或多次。匹配前面的字符一次或多次。?匹配前面的字符零次或一次。{n}匹配前面的字符恰好 n 次。{n,}匹配前面的字符至少 n 次。{n,m}匹配前面的字符至少 n 次至多 m 次。\转义字符用于匹配元字符本身。|或操作符匹配左边或右边的表达式。[]字符集匹配其中的任意一个字符。()分组将多个字符作为一个整体进行匹配。
3. 常用字符集
\d匹配任意数字等价于 [0-9]。\D匹配任意非数字字符等价于 [^0-9]。\w匹配任意字母、数字或下划线等价于 [a-zA-Z0-9_]。\W匹配任意非字母、数字或下划线的字符等价于 [^a-zA-Z0-9_]。\s匹配任意空白字符包括空格、制表符、换行符等。\S匹配任意非空白字符。
4. re 模块常用函数
re.match(pattern, string)从字符串的起始位置匹配正则表达式如果匹配成功返回匹配对象否则返回 None。re.search(pattern, string)在字符串中搜索匹配正则表达式的第一个位置如果匹配成功返回匹配对象否则返回 None。re.findall(pattern, string)返回字符串中所有匹配正则表达式的子串返回一个列表。re.finditer(pattern, string)返回一个迭代器包含所有匹配正则表达式的子串。re.sub(pattern, repl, string)将字符串中匹配正则表达式的部分替换为 repl。re.split(pattern, string)根据正则表达式匹配的子串将字符串分割返回一个列表。
5. 示例
5.1 匹配数字
import retext The price is 123.45 dollars.
pattern r\d\.\d
match re.search(pattern, text)
if match:print(Found:, match.group())5.2 替换字符串
import retext Hello, world!
pattern rworld
repl Python
new_text re.sub(pattern, repl, text)
print(new_text) # 输出: Hello, Python!5.3 分割字符串
import retext apple,banana,cherry
pattern r,
result re.split(pattern, text)
print(result) # 输出: [apple, banana, cherry]5.4 查找所有匹配
import retext The rain in Spain falls mainly in the plain.
pattern r\bin\b
matches re.findall(pattern, text)
print(matches) # 输出: [in, in, in]6. 分组和捕获
分组使用 () 来定义可以捕获匹配的子串。
import retext John Doe, Jane Doe
pattern r(\w) (\w)
matches re.findall(pattern, text)
for first_name, last_name in matches:print(fFirst: {first_name}, Last: {last_name})7. 非贪婪匹配
默认情况下* 和 是贪婪的会尽可能多地匹配字符。可以在它们后面加上 ? 来使其变为非贪婪匹配。
import retext htmlheadtitleTitle/title/head/html
pattern r.*?
matches re.findall(pattern, text)
print(matches) # 输出: [html, head, title, /title, /head, /html]8. 编译正则表达式
如果需要多次使用同一个正则表达式可以将其编译为正则表达式对象以提高效率。
import repattern re.compile(r\d)
text There are 3 apples and 5 oranges.
matches pattern.findall(text)
print(matches) # 输出: [3, 5]9. 标志Flags
re 模块提供了一些标志来修改正则表达式的行为如忽略大小写、多行匹配等。
re.IGNORECASE 或 re.I忽略大小写。re.MULTILINE 或 re.M多行模式^ 和 $ 匹配每行的开头和结尾。re.DOTALL 或 re.S使 . 匹配包括换行符在内的所有字符。
import retext Hello\nWorld
pattern r^world
match re.search(pattern, text, re.IGNORECASE | re.MULTILINE)
if match:print(Found:, match.group())小结
正则表达式是处理文本的强大工具Python 的 re 模块提供了丰富的功能来支持正则表达式的使用。通过掌握正则表达式的基本语法和 re 模块的常用函数你可以高效地处理各种文本匹配和替换任务。 二、经典范例
以下是 10 个经典的正则表达式应用实例每个实例都包含正则表达式的解释、测试代码以及执行结果的注释说明。 1. 匹配邮箱地址
正则表达式: r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$
解释匹配常见的邮箱地址格式。^ 和 $ 表示字符串的开始和结束。[a-zA-Z0-9_.-] 匹配用户名部分。 匹配邮箱中的 符号。[a-zA-Z0-9-] 匹配域名部分。\. 匹配域名中的点 .。[a-zA-Z0-9-.] 匹配顶级域名部分。
import repattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$
emails [testexample.com, user.nametagsortingexample.com, invalid-emailcom]
for email in emails:if re.match(pattern, email):print(fValid: {email})else:print(fInvalid: {email})# 执行结果:
# Valid: testexample.com
# Valid: user.nametagsortingexample.com
# Invalid: invalid-emailcom2. 匹配手机号码
正则表达式: r^1[3-9]\d{9}$
解释匹配中国大陆的手机号码。1 表示手机号码的第一位。[3-9] 表示第二位可以是 3 到 9 之间的数字。\d{9} 表示后面跟着 9 位数字。
import repattern r^1[3-9]\d{9}$
phones [13800138000, 12345678901, 19912345678]
for phone in phones:if re.match(pattern, phone):print(fValid: {phone})else:print(fInvalid: {phone})# 执行结果:
# Valid: 13800138000
# Invalid: 12345678901
# Valid: 199123456783. 匹配 URL
正则表达式: rhttps?://(?:www\.)?\S
解释匹配 HTTP 或 HTTPS 协议的 URL。https? 匹配 http 或 https。:// 匹配 URL 中的协议分隔符。(?:www\.)? 匹配可选的 www.。\S 匹配 URL 的其余部分。
import repattern rhttps?://(?:www\.)?\S
urls [https://www.example.com, http://example.com, ftp://example.com]
for url in urls:if re.match(pattern, url):print(fValid: {url})else:print(fInvalid: {url})# 执行结果:
# Valid: https://www.example.com
# Valid: http://example.com
# Invalid: ftp://example.com4. 匹配日期YYYY-MM-DD
正则表达式: r^\d{4}-[01]?[0-2]-[0123]?[0-9]$
解释匹配 YYYY-MM-DD 格式的日期。\d{4} 匹配 4 位年份。- 匹配日期分隔符。[01]?[0-2] 匹配 2 位月份。[0123]?[0-9] 匹配 2 位日期。
import repattern r^\d{4}-[01]?[0-2]-[0123]?[0-9]$
dates [2023-10-05, 2023/10/05, 2023-13-01]
for date in dates:if re.match(pattern, date):print(fValid: {date})else:print(fInvalid: {date})# 执行结果:
# Valid: 2023-10-05
# Invalid: 2023/10/05
# Invalid: 2023-13-015. 匹配 IP 地址
正则表达式: r^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
解释匹配 IPv4 地址。\d{1,3} 匹配 1 到 3 位数字。\. 匹配 IP 地址中的点 .。
import repattern r^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
ips [192.168.1.1, 256.256.256,256, 127.0.0.1]
for ip in ips:if re.match(pattern, ip):print(fValid: {ip})else:print(fInvalid: {ip})# 执行结果:
# Valid: 192.168.1.1
# Invalid: 256.256.256.256
# Valid: 127.0.0.16. 匹配 HTML 标签
正则表达式: r(\w)[^]*(.*?)/\1
解释匹配 HTML 标签及其内容。(\w) 匹配标签名。[^]* 匹配标签内的属性。(.*?) 匹配标签内容。/\1 匹配对应的闭合标签。
import repattern r(\w)[^]*(.*?)/\1
html div classtestHello World/div
match re.search(pattern, html)
if match:print(fTag: {match.group(1)}, Content: {match.group(2)})# 执行结果:
# Tag: div, Content: Hello World7. 匹配中文字符
正则表达式: r[\u4e00-\u9fff]
解释匹配中文字符。[\u4e00-\u9fff] 是中文字符的 Unicode 范围。
import repattern r[\u4e00-\u9fff]
text Hello 世界
matches re.findall(pattern, text)
print(matches) # 执行结果: [世界]8. 匹配密码强度
正则表达式: r^(?.*[A-Z])(?.*[a-z])(?.*\d)(?.*[\W_]).{8,}$
解释匹配强密码至少 8 位包含大小写字母、数字和特殊字符。(?.*[A-Z]) 确保至少有一个大写字母。(?.*[a-z]) 确保至少有一个小写字母。(?.*\d) 确保至少有一个数字。(?.*[\W_]) 确保至少有一个特殊字符。.{8,} 确保密码长度至少为 8。
import repattern r^(?.*[A-Z])(?.*[a-z])(?.*\d)(?.*[\W_]).{8,}$
passwords [Password123!, weakpass, StrongPass1]
for pwd in passwords:if re.match(pattern, pwd):print(fStrong: {pwd})else:print(fWeak: {pwd})# 执行结果:
# Strong: Password123!
# Weak: weakpass
# Strong: StrongPass19. 匹配十六进制颜色值
正则表达式: r^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
解释匹配十六进制颜色值如 #FFFFFF 或 #FFF。# 匹配颜色值开头的 #。[A-Fa-f0-9]{6} 匹配 6 位十六进制值。[A-Fa-f0-9]{3} 匹配 3 位十六进制值。
import repattern r^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
colors [#FFFFFF, #FFF, #123456, #GHIJKL]
for color in colors:if re.match(pattern, color):print(fValid: {color})else:print(fInvalid: {color})# 执行结果:
# Valid: #FFFFFF
# Valid: #FFF
# Valid: #123456
# Invalid: #GHIJKL10. 匹配文件名和扩展名
正则表达式: r^(\w)\.(\w)$
解释匹配文件名和扩展名。(\w) 匹配文件名。\. 匹配点 .。(\w) 匹配扩展名。
import repattern r^(\w)\.(\w)$
filename example.txt
match re.match(pattern, filename)
if match:print(fFilename: {match.group(1)}, Extension: {match.group(2)})# 执行结果:
# Filename: example, Extension: txt三、避坑宝典
在使用正则表达式时初学者和中级用户经常会遇到一些常见错误。以下是 10 种常见的正则表达式错误、原因分析以及纠错方法。 1. 忘记转义特殊字符
错误直接使用 .、*、 等元字符而未转义。
import re
pattern rexample.com
text example-com
match re.search(pattern, text) # 无法匹配原因. 是元字符匹配任意字符而不是字面的点 .。 纠错使用 \. 转义。
pattern rexample\.com2. 贪婪匹配导致意外结果
错误使用 .* 或 . 时匹配过多内容。
import re
pattern r.*
text divHello/divpWorld/p
match re.search(pattern, text) # 匹配整个字符串原因* 和 是贪婪的会尽可能多地匹配字符。 纠错使用非贪婪匹配 .*? 或 .?。
pattern r.*?3. 忽略多行模式
错误在多行文本中使用 ^ 或 $ 时未启用多行模式。
import re
pattern r^Hello
text Line1\nHello\nLine2
match re.search(pattern, text) # 无法匹配原因默认情况下^ 和 $ 只匹配字符串的开头和结尾。 纠错使用 re.MULTILINE 标志。
match re.search(pattern, text, re.MULTILINE)4. 字符集未正确使用
错误在字符集中未正确使用 -。
import re
pattern r[A-Z]
text abc123
match re.search(pattern, text) # 无法匹配小写字母原因[A-Z] 只匹配大写字母。 纠错使用 [A-Za-z] 匹配所有字母。
pattern r[A-Za-z]5. 分组捕获错误
错误未正确使用分组捕获。
import re
pattern r(\d{2})-(\d{2})-(\d{4})
text 12-31-2023
match re.search(pattern, text)
if match:print(match.group(1)) # 输出 12原因分组索引从 1 开始group(0) 是整个匹配内容。 纠错确保使用正确的分组索引。
if match:print(match.group(1), match.group(2), match.group(3)) # 输出 12 31 20236. 忽略大小写
错误未忽略大小写导致匹配失败。
import re
pattern rhello
text Hello World
match re.search(pattern, text) # 无法匹配原因默认情况下正则表达式区分大小写。 纠错使用 re.IGNORECASE 标志。
match re.search(pattern, text, re.IGNORECASE)7. 量词使用错误
错误量词使用不当导致匹配失败。
import re
pattern r\d{3,5}
text 123
match re.search(pattern, text) # 匹配成功但可能不符合预期原因{3,5} 表示匹配 3 到 5 个数字但可能匹配过多。 纠错根据需求调整量词。
pattern r\d{3} # 只匹配 3 个数字8. 未正确处理边界
错误未使用单词边界 \b。
import re
pattern rcat
text category
match re.search(pattern, text) # 匹配成功但可能不符合预期原因cat 会匹配 category 中的 cat。 纠错使用 \b 确保匹配完整单词。
pattern r\bcat\b9. 忽略空白字符
错误未正确处理空白字符。
import re
pattern rhello world
text hello world
match re.search(pattern, text) # 无法匹配原因正则表达式中的空格是字面匹配。 纠错使用 \s 匹配空白字符。
pattern rhello\sworld10. 未正确处理换行符
错误未正确处理多行文本中的换行符。
import re
pattern r^Hello
text Line1\nHello\nLine2
match re.search(pattern, text) # 无法匹配原因不能正确处理换行符。 纠错使用 re.MULTILINE 标志。
match re.search(pattern, text, re.MULTILINE)小结
正则表达式虽然强大但在使用时容易犯一些常见错误。通过理解这些错误的原因并掌握纠错方法可以更高效地使用正则表达式处理文本。 四、水平考试
这是一份关于“正则表达式”的测试试卷。包含选择题15 道、填空题10 道和 编程题5 道总分 100 分。每道题后附有答案和解析。 选择题每题 2 分共 30 分 以下哪个正则表达式可以匹配任意数字 A. \dB. \DC. \wD. \s 答案A 解析\d 匹配任意数字\D 匹配非数字\w 匹配字母、数字或下划线\s 匹配空白字符。 以下哪个正则表达式可以匹配一个或多个字母 A. [a-z]B. [a-z]C. [a-z]*D. [a-z]? 答案B 解析 表示前面的字符至少出现一次。 以下哪个正则表达式可以匹配字符串的开头 A. $B. ^C. \bD. \B 答案B 解析^ 匹配字符串的开头$ 匹配字符串的结尾。 以下哪个正则表达式可以匹配一个单词边界 A. \bB. \BC. ^D. $ 答案A 解析\b 匹配单词边界\B 匹配非单词边界。 以下哪个正则表达式可以匹配一个浮点数 A. \d\.\dB. \d*\.\d*C. \d\.\d*D. \d*\.\d 答案A 解析\d\.\d 匹配至少一个数字后跟一个小数点再跟至少一个数字。 以下哪个正则表达式可以匹配一个邮箱地址 A. [a-zA-Z0-9][a-zA-Z0-9]\.[a-zA-Z]B. [a-zA-Z0-9][a-zA-Z0-9]C. [a-zA-Z0-9][a-zA-Z0-9]\.[a-zA-Z0-9]D. [a-zA-Z0-9][a-zA-Z0-9]\.[a-zA-Z0-9]\. 答案A 解析邮箱地址的格式为 用户名域名.顶级域名。 以下哪个正则表达式可以匹配一个 URL A. https?://\SB. http://\SC. https://\SD. http://\S 答案A 解析https? 匹配 http 或 https\S 匹配非空白字符。 以下哪个正则表达式可以匹配一个 HTML 标签 A. .*B. .*?C. .D. .? 答案B 解析.*? 使用非贪婪匹配避免匹配过多内容。 以下哪个正则表达式可以匹配一个中文字符 A. [\u4e00-\u9fff]B. [a-zA-Z]C. \dD. \w 答案A 解析[\u4e00-\u9fff] 是中文字符的 Unicode 范围。 以下哪个正则表达式可以匹配一个 IP 地址 A. \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}B. \d{1,3}\.\d{1,3}\.\d{1,3}C. \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}D. \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 答案A 解析IPv4 地址由 4 个 1 到 3 位的数字组成用 . 分隔。 以下哪个正则表达式可以匹配一个日期YYYY-MM-DD A. \d{4}-\d{2}-\d{2}B. \d{2}-\d{2}-\d{4}C. \d{4}/\d{2}/\d{2}D. \d{2}/\d{2}/\d{4} 答案A 解析\d{4}-\d{2}-\d{2} 匹配 YYYY-MM-DD 格式的日期。 以下哪个正则表达式可以匹配一个时间HH:MM:SS A. \d{2}:\d{2}:\d{2}B. \d{2}:\d{2}C. \d{2}:\d{2}:\d{2}:\d{2}D. \d{2}:\d{2}:\d{2}:\d{2}:\d{2} 答案A 解析\d{2}:\d{2}:\d{2} 匹配 HH:MM:SS 格式的时间。 以下哪个正则表达式可以匹配一个十六进制颜色值 A. #[A-Fa-f0-9]{6}B. #[A-Fa-f0-9]{3}C. #[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3}D. #[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3}|#[A-Fa-f0-9]{2} 答案C 解析十六进制颜色值可以是 3 位或 6 位。 以下哪个正则表达式可以匹配一个文件名和扩展名 A. \w\.\wB. \w\.\wC. \w\.\w{2,4}D. \w\.\w\.\w 答案A 解析\w\.\w 匹配文件名和扩展名。 以下哪个正则表达式可以匹配一个强密码至少 8 位包含大小写字母、数字和特殊字符 A. ^(?.*[A-Z])(?.*[a-z])(?.*\d)(?.*[\W_]).{8,}$B. ^(?.*[A-Z])(?.*[a-z])(?.*\d).{8,}$C. ^(?.*[A-Z])(?.*[a-z]).{8,}$D. ^(?.*[A-Z])(?.*\d).{8,}$ 答案A 解析(?.*[A-Z]) 确保至少有一个大写字母(?.*[a-z]) 确保至少有一个小写字母(?.*\d) 确保至少有一个数字(?.*[\W_]) 确保至少有一个特殊字符。 填空题每题 3 分共 30 分 正则表达式 \d{3}-\d{2}-\d{4} 可以匹配的格式是________。 答案XXX-XX-XXXX例如123-45-6789 正则表达式 ^[A-Za-z]$ 可以匹配的字符串是________。 答案仅包含字母的字符串 正则表达式 \b\w\b 可以匹配的字符串是________。 答案一个完整的单词 正则表达式 \d{2}:\d{2}:\d{2} 可以匹配的格式是________。 答案HH:MM:SS例如12:34:56 正则表达式 [\u4e00-\u9fff] 可以匹配的字符串是________。 答案中文字符 正则表达式 ^[a-zA-Z0-9_]{4,16}$ 可以匹配的字符串是________。 答案4 到 16 位的用户名字母、数字、下划线 正则表达式 https?://\S 可以匹配的字符串是________。 答案HTTP 或 HTTPS 协议的 URL 正则表达式 \d\.\d 可以匹配的字符串是________。 答案浮点数例如3.14 正则表达式 ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$ 可以匹配的字符串是________。 答案十六进制颜色值例如#FFFFFF 或 #FFF 正则表达式 ^(\d{4})-(\d{2})-(\d{2})$ 可以匹配的格式是________。 答案YYYY-MM-DD例如2023-10-05 编程题每题 8 分共 40 分 编写一个正则表达式匹配一个合法的邮箱地址。 答案 import re
pattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$
emails [testexample.com, invalid-emailcom]
for email in emails:if re.match(pattern, email):print(fValid: {email})else:print(fInvalid: {email})编写一个正则表达式匹配一个合法的手机号码中国大陆。 答案 import re
pattern r^1[3-9]\d{9}$
phones [13800138000, 12345678901]
for phone in phones:if re.match(pattern, phone):print(fValid: {phone})else:print(fInvalid: {phone})编写一个正则表达式匹配一个合法的 URL。 答案 import re
pattern rhttps?://(?:www\.)?\S
urls [https://www.example.com, ftp://example.com]
for url in urls:if re.match(pattern, url):print(fValid: {url})else:print(fInvalid: {url})编写一个正则表达式匹配一个合法的日期YYYY-MM-DD。 答案 import re
pattern r^\d{4}-\d{2}-\d{2}$
dates [2023-10-05, 2023/10/05]
for date in dates:if re.match(pattern, date):print(fValid: {date})else:print(fInvalid: {date})编写一个正则表达式匹配一个合法的强密码至少 8 位包含大小写字母、数字和特殊字符。 答案 import re
pattern r^(?.*[A-Z])(?.*[a-z])(?.*\d)(?.*[\W_]).{8,}$
passwords [Password123!, weakpass]
for pwd in passwords:if re.match(pattern, pwd):print(fStrong: {pwd})else:print(fWeak: {pwd})总分100 分
选择题15 题 × 2 分 30 分填空题10 题 × 3 分 30 分编程题5 题 × 8 分 40 分 五、实战案例
本节内容包含 3 个关于“正则表达式”的综合应用项目每个项目都包含完整的程序代码、测试案例、执行结果以及代码说明。具体项目是
邮箱地址提取器日志文件分析器HTML 标签提取器 项目 1邮箱地址提取器
功能描述
从一段文本中提取所有合法的邮箱地址。
代码
import redef extract_emails(text):# 正则表达式匹配邮箱地址pattern r[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]# 查找所有匹配的邮箱地址emails re.findall(pattern, text)return emails# 测试案例
text
Contact us at supportexample.com or salesexample.org.
For more information, visit https://www.example.com.
Invalid email: usercom.emails extract_emails(text)
print(Extracted emails:, emails)执行结果
Extracted emails: [supportexample.com, salesexample.org]代码说明
使用正则表达式 [a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.] 匹配邮箱地址。re.findall 返回所有匹配的邮箱地址。 项目 2日志文件分析器
功能描述
从日志文件中提取所有错误日志包含 “ERROR” 关键字。
代码
import redef extract_errors(log_file):# 正则表达式匹配错误日志pattern rERROR.*errors []with open(log_file, r) as file:for line in file:match re.search(pattern, line)if match:errors.append(match.group())return errors# 测试案例
log_file sample_log.txt
# 假设 sample_log.txt 内容如下INFO: User logged in
ERROR: Failed to connect to database
INFO: Request processed
ERROR: File not founderrors extract_errors(log_file)
print(Error logs:)
for error in errors:print(error)执行结果
Error logs:
ERROR: Failed to connect to database
ERROR: File not found代码说明
使用正则表达式 ERROR.* 匹配以 “ERROR” 开头的日志行。逐行读取日志文件并提取匹配的错误日志。 项目 3HTML 标签提取器
功能描述
从 HTML 文本中提取所有标签及其内容。
代码
import redef extract_html_tags(html):# 正则表达式匹配 HTML 标签及其内容pattern r(\w)[^]*(.*?)/\1tags re.findall(pattern, html)return tags# 测试案例
html
div classheaderWelcome/div
pThis is a btest/b paragraph./p
a hrefhttps://example.comLink/atags extract_html_tags(html)
print(HTML tags and content:)
for tag, content in tags:print(fTag: {tag}, Content: {content})执行结果
HTML tags and content:
Tag: div, Content: Welcome
Tag: p, Content: This is a btest/b paragraph.
Tag: a, Content: Link代码说明
使用正则表达式 (\w)[^]*(.*?)/\1 匹配 HTML 标签及其内容。re.findall 返回所有匹配的标签及其内容。 小结
以上 3 个迷你项目展示了正则表达式在实际应用中的强大功能包括文本提取、日志分析、HTML 处理等。通过这些项目可以更好地理解和掌握正则表达式的使用。