Python学习笔模式匹配与正则表达式之电话号码和Email地址提取程序
随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址。如果手动翻页,可能需要查找很长时间。
如果有一个程序,可以在剪贴板的文本中查找电话号码和 E-mail 地址,那你就只要按一下 Ctrl-A 选择所有文本,按下 Ctrl-C 将它复
制到剪贴板,然后运行你的程序。它会用找到的电话号码和 E-mail地址,替换掉剪贴板中的文本。当你开始接手一个新项目时,很容
易想要直接开始写代码。但更多的时候,最好是后退一步,考虑更大的图景。我建议先草拟高层次的计划,弄清楚程序需要做什么。
暂时不要思考真正的代码,稍后再来考虑。现在,先关注大框架。例如,你的电话号码和 E-mail 地址提取程序需要完成以下任务:
(1)从剪贴板取得文本。
(2) 找出文本中所有的电话号码和 E-mail 地址。
(3)将它们粘贴到剪贴板。
(4)现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情:
(5) 使用 pyperclip 模块复制和粘贴字符串。
(6)创建两个正则表达式,一个匹配电话号码,另一个匹配 E-mail 地址。
(7)对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
(8) 将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
(9)如果文本中没有找到匹配,显示某种消息。
这个列表就像项目的路线图。在编写代码时,可以独立地关注其中的每一步。每一步都很好管理。它的表达方式让你知道在 Python
中如何去做。
#------------------------------------------------我是可耻的分割线-------------------------------------------
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import re,pyperclip #定义正则表达式,找出文本中所有的电话号码。 phoneRegex = re. compile (r '''( #匹配区号,因为区号可能只是三位数字,也可能是括号中三位数字,所以使用?问号和管道匹配分组中的内容一次或零次 (\d{3}|\(\d{3}\))? #匹配电话号码的连接符,因为区号与号码之间可能是字母也可能是短横线或者.点符号,所以把他们分在一个组用管道和问号匹配 (\s|-|\.)? #匹配短横线后面的三位数字 (\d{3}) #匹配电话号码的连接符,因为区号与号码之间可能是字母也可能是短横线或者.点符号,所以把他们分在一个组用管道和问号匹配 (\s|-|\.) #匹配四个数字 (\d{4}) #匹配分机号 (\s*(ext|x|ext.)\s*(\d{2,5}))? )''' , re.VERBOSE) #定义正则表达式,找出文本中所有的E-mail 地址。 emailRegex = re. compile (r '''( #创建自定义字符分类,匹配小写a到z、大写A到Z和数字0到9,后面可以有._%+- [a-zA-Z0-9._%+-]+ #自定义字符分类后面是安特符号 @ #自定义字符分类,匹配写a到z、大写A到Z和数字0到9,后面可以有.- [a-zA-Z0-9.-]+ #匹配分组,.点后面可以是任意大小写字母,可以有2到4个 (\.[a-zA-Z]{2,4}) )''' ,re.VERBOSE) #从剪贴板取得文本。 text = str (pyperclip.paste()) #创建一个空列表,将所有的匹配保存在名为 matches 的列表变量中 matches = [] #循环匹配到的电话号码 for groups in phoneRegex.findall(text): #把匹配到的电话号码,区号、前三位数字、后四位数字转换为字符串,以断横杠分割 phoneNum = '-' .join([groups[ 1 ],groups[ 3 ],groups[ 5 ]]) #判断分机号是否不等于空 if groups[ 8 ] ! = '': #电话号码中带有分机号时,在分机号前面加空格和大写X phoneNum + = ' X' + groups[ 8 ] #把分机号追加到matches列表中 matches.append(phoneNum) #循环匹配到的email地址 for groups in emailRegex.findall(text): #分组0 匹配整个正则表达式,把email地址追加到matches列表中 matches.append(groups[ 0 ]) if len (matches) > 0 : # 将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。 pyperclip.copy( '\n' .join(matches)) print ( 'Copied to clipboard:' ) # 打印放入粘贴版的内容。 print ( '\n' .join(matches)) else : # 如果文本中没有找到匹配,显示某种消息。 print ( 'No phone numbers or email addresses found.' ) |
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异