查找网站中的电话号码和 E-mail 地址

1.问题

假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址。如果手动翻页,可能需要查找很长时间。如果有一个程序,可以在剪贴板的文本中查找电话号码和 E-mail 地址,那你就只要按一下 Ctrl-A 选择所有文本,
按下 Ctrl-C 将它复制到剪贴板,然后运行你的程序。它会用找到的电话号码和 E-mail地址,替换掉剪贴板中的文本。

2.解决步骤

  1. 从剪贴板取得文本。
  2. 找出文本中所有的电话号码和 E-mail 地址。
  3. 将它们粘贴到剪贴板。
  4. 现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情:
  5. 使用 pyperclip 模块复制和粘贴字符串。
  6. 创建两个正则表达式,一个匹配电话号码,另一个匹配 E-mail 地址。
  7. 对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
  8. 将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
  9. 如果文本中没有找到匹配,显示某种消息

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.参考资料:

  1. Python编程快速上手——让繁琐工作自动化
上一篇:正则表达式——分组匹配


下一篇:CF1137F Matches Are Not a Child's Play