1.问题
假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址。如果手动翻页,可能需要查找很长时间。如果有一个程序,可以在剪贴板的文本中查找电话号码和 E-mail 地址,那你就只要按一下 Ctrl-A 选择所有文本,
按下 Ctrl-C 将它复制到剪贴板,然后运行你的程序。它会用找到的电话号码和 E-mail地址,替换掉剪贴板中的文本。
2.解决步骤
- 从剪贴板取得文本。
- 找出文本中所有的电话号码和 E-mail 地址。
- 将它们粘贴到剪贴板。
- 现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情:
- 使用 pyperclip 模块复制和粘贴字符串。
- 创建两个正则表达式,一个匹配电话号码,另一个匹配 E-mail 地址。
- 对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
- 将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
- 如果文本中没有找到匹配,显示某种消息
3.代码
#! python3
# phoneAndEmail.py - Finds phone numbers and email addresses on the clipboard
import pyperclip, re
# \s 匹配任意空白字符,等价于 [ \t\n\r\f]
# \d 匹配任意数字,等价于 [0-9]
# * 对它前面的正则式匹配0到任意次重复,尽量多的匹配字符串。ab* 会匹配 'a','ab',
# 或者'a'后面跟随任意个'b'。
# ? 对它前面的正则式匹配0到1次重复。 ab?会匹配'a'或者'ab'。
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
(\d{3}) # first 3 digits
(\s|-|\.) # separator
(\d{4}) # last 4 digits
(\s*(ext|x|ext.)\s*(\d{2,5}))? # extension
)''', re.VERBOSE)
# [0-9] 匹配任何数字。类似于 [0123456789]
# [a-z] 匹配任何小写字母
# [A-Z] 匹配任何大写字母
# [a-zA-Z0-9] 匹配任何字母及数字
# . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
# + 对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 'a' 后面跟随1个以上到任意个'b',
# 它不会匹配'a'。
emailRegex = re.compile(r'''(
[a-zA-Z0-9._%+-]+ # username,可能包含小写和大写字母、数字、句点、下划线、百分号、加号或短横
@ # @ symbol
[a-zA-Z0-9.-]+ # domain name
(\.[a-zA-Z]{2,4}) # dot-something
)''', re.VERBOSE)
# Find matches in clipboard text
text = str(pyperclip.paste())
matches = []
for groups in phoneRegex.findall(text):
# 将groups[1], groups[3], groups[5]连接为一个字符串,每个groups使用'-'隔开
phoneNum = '-'.join([groups[1], groups[3], groups[5]])
if groups[8] != '':
phoneNum += ' x' + groups[8]
matches.append(phoneNum)
for groups in emailRegex.findall(text):
matches.append(groups[0])
# Copy results to the clipboard.
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.')
4.测试结果
输入:
155156-55658156
800-420-7240
415-863-9900
415-863-9950
soidofs@dsdgdfsfv
info@nostarch.com
media@nostarch.com
academic@nostarch.c
输出:
Copied to clipboard:
800-420-7240
415-863-9900
415-863-9950
info@nostarch.com
media@nostarch.com
academic@nostarch.com
help@nostarch.com
5.参考资料:
- Python编程快速上手——让繁琐工作自动化