Python 实现电话号码和Email地址提取程序
背景
在日常工作或学习中,我们经常需要从网页或文档中提取信息,比如电话号码和E-mail地址。手动查找和提取这些信息可能会耗费大量时间,而自动化工具可以帮助我们快速完成这个任务。
本篇博客将带你一步步实现一个程序,从剪贴板中提取所有电话号码和E-mail地址,并将它们整理后再复制到剪贴板中。
任务目标
- 从剪贴板取得文本。
- 找出文本中的所有电话号码和E-mail地址。
- 将它们粘贴到剪贴板,以便快速使用。
实现步骤
1. 安装依赖库
我们需要 pyperclip
库来实现从剪贴板复制和粘贴文本。如果你还没有安装 pyperclip
,可以通过以下命令进行安装:
pip install pyperclip
2. 编写程序
接下来,我们将逐步实现该程序:
- 使用
pyperclip
从剪贴板获取文本。 - 编写两个正则表达式,一个匹配电话号码,另一个匹配 E-mail 地址。
- 使用正则表达式提取所有匹配项。
- 将提取到的电话号码和 E-mail 地址整理后粘贴到剪贴板。
- 显示消息,提示用户结果。
3. Python 代码实现
import pyperclip
import re
# 1. 创建电话号码的正则表达式
phone_regex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # 区号 (可选)
(\s|-|\.)? # 分隔符 (可选)
(\d{3}) # 前三个数字
(\s|-|\.) # 分隔符
(\d{4}) # 后四个数字
(\s*(ext|x|ext.)\s*(\d{2,5}))? # 分机号 (可选)
)''', re.VERBOSE)
# 2. 创建 E-mail 地址的正则表达式
email_regex = re.compile(r'''(
[a-zA-Z0-9._%+-]+ # 用户名
@ # @ 符号
[a-zA-Z0-9.-]+ # 域名
(\.[a-zA-Z]{2,4}) # 顶级域名
)''', re.VERBOSE)
# 3. 从剪贴板中获取文本
text = pyperclip.paste()
# 4. 在文本中找到所有电话号码和 E-mail 地址
matches = []
# 查找电话号码
for groups in phone_regex.findall(text):
phone_num = '-'.join([groups[1], groups[3], groups[5]])
if groups[8] != '':
phone_num += f' ext{groups[8]}'
matches.append(phone_num)
# 查找 E-mail 地址
for groups in email_regex.findall(text):
matches.append(groups[0])
# 5. 如果找到了匹配项,就将它们复制到剪贴板
if matches:
# 将结果整理成一个字符串,每行一个结果
results = '\n'.join(matches)
pyperclip.copy(results)
print("已找到以下电话号码和E-mail地址,并复制到剪贴板:")
print(results)
else:
print("未找到任何电话号码或E-mail地址。")
4. 代码详细说明
-
正则表达式:
- 电话号码正则表达式:
(\d{3}|\(\d{3}\))?
:匹配可选的3位区号,允许括号表示法,如(123)
。(\s|-|\.)?
:匹配可选的分隔符,如空格、短横线或点号。(\d{3})
和(\d{4})
:匹配电话号码的前3位和后4位数字。(ext|x|ext.)?
:匹配可选的分机号,如ext. 1234
。
- E-mail 地址正则表达式:
[a-zA-Z0-9._%+-]+
:匹配用户名部分,支持字母、数字、点、下划线、百分号等。@
:匹配@
符号。[a-zA-Z0-9.-]+
:匹配域名。(\.[a-zA-Z]{2,4})
:匹配顶级域名,如.com
或.cn
。
- 电话号码正则表达式:
-
pyperclip:
pyperclip.paste()
:从剪贴板中获取文本。pyperclip.copy()
:将结果复制到剪贴板。
-
匹配过程:
- 通过
phone_regex.findall(text)
和email_regex.findall(text)
,找到文本中的所有电话号码和 E-mail 地址。 - 将所有匹配项整理成字符串,逐行输出并复制到剪贴板。
- 通过
5. 程序运行示例
假设剪贴板内容如下:
Contact us at (123) 456-7890 or 987-654-3210 ext. 123.
You can also email support@example.com or info@company.com.
程序输出:
已找到以下电话号码和E-mail地址,并复制到剪贴板:
123-456-7890
987-654-3210 ext123
support@example.com
info@company.com
6. 未找到匹配时的提示
如果文本中没有电话号码或 E-mail 地址,程序将输出:
未找到任何电话号码或E-mail地址。
结论
通过 pyperclip
模块结合正则表达式,可以轻松实现从剪贴板中提取电话号码和 E-mail 地址的程序。这个小工具可以广泛应用于信息采集、数据整理等场景,极大提升工作效率。在实际使用中,你可以根据需要对正则表达式进行扩展,以适应更多格式的电话号码和 E-mail 地址。