python练习项目一——对复制的文本中的电话号码和e-mail地址提取

项目一:电话号码和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 = 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)

# Create email regex.
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):
    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.')

你可能感兴趣的:(Python)