项目一:电话号码和E-mail 地址提取程序
背景
假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址。如果手动翻页,可能需要查找很长时间。如果有一个程序,可以在剪贴板的文本中查找电话号码和E-mail 地址,那你就只要按一下Ctrl-A 选择所有文本,按下Ctrl-C 将它复制到剪贴板,然后运行你的程序。它会用找到的电话号码和E-mail地址,替换掉剪贴板中的文本。
练习内容
模式匹配与正则化表达
- 正则化表达模块:re模块
compile()方法创建一个Regex对象 - 匹配Regex对象
search()方法:查找传入的字符串,返回一个Match对象,包含被查找字符串中的“第一次”匹配的文本
findall()方法:返回一组字符串,包含被查找字符串中的所有匹配 - 匹配更多模式
利用括号分组
用管道匹配多个分组
用问号实现可选匹配
用星号匹配零次或多次
用加号匹配一次或多次
用花括号匹配特定次数 - 贪心和非贪心匹配
- 字符分类
建立自己的字符分类
插入字符和美元字符
可以在正则表达式的开始处使用插入符号( ^ ),表明匹配必须发生在被查找文本开始处。类似地,可以再正则表达式的末尾加上美元符号( $ ),表示该字符串必须以这个正则表达式的模式结束。可以同时使用^ 和$,表明整个字符串必须匹配该模式,也就是说,只匹配该字符串的某个子集是不够的。 - 通配字符
在正则表达式中,.(句点)字符称为“通配符”。它匹配除了换行之外的所有字符
用点-星匹配所有字符
用句点字符匹配换行 - 用sub()方法替换字符串
- 组合使用re.IGNOREC ASE、re.DOTALL 和re.VERBOSE
re.VERBOSE 来编写注释
re.IGNORECASE 来忽略大小写
re.DOTALL 让.(句点)匹配所有字符,包括换行符
参考思路
当你开始接手一个新项目时,很容易想要直接开始写代码。但更多的时候,最好是后退一步,考虑更大的图景。我建议先草拟高层次的计划,弄清楚程序需要做什么。暂时不要思考真正的代码,稍后再来考虑。现在,先关注大框架。
例如,你的电话号码和E-mail 地址提取程序需要完成以下任务:
- 从剪贴板取得文本。
- 找出文本中所有的电话号码和E-mail 地址。
- 将它们粘贴到剪贴板。
现在你可以开始思考,如何用代码来完成工作。代码需要做下面的事情: - 使用pyperclip 模块复制和粘贴字符串。
- 创建两个正则表达式,一个匹配电话号码,另一个匹配E-mail 地址。
- 对两个正则表达式,找到所有的匹配,而不只是第一次匹配。
- 将匹配的字符串整理好格式,放在一个字符串中,用于粘贴。
- 如果文本中没有找到匹配,显示某种消息。
这个列表就像项目的路线图。在编写代码时,可以独立地关注其中的每一步。
每一步都很好管理。它的表达方式让你知道在Python 中如何去做。
实现代码:
#! python3
# phoneAndEmail.py - Finds phone numbers and email addresses on the clipboard.
import pyperclip
import re
phoneRegex