Python实战之特定文本提取,挑战高效办公的第一步

@TOC

最近很多地方都在宣传Python的自动化办公的强大之处,那么今天大灰狼就来和大家分享一个Python自动化办公的实战项目。

很多时候我们会在很多繁琐而无聊的任务中而浪费大量的时间,比如说会在一篇很长的网页或者文档中找出所有的电话和E-mail地址,如果手动查找可能是需要花费大量的时间和精力。

但是如果说现在有一个程序,可以在剪贴板的文本中查找电话号码和E-mail地址,只需要你按一下Ctrl+A所有文本,按一下Ctrl+C将它复制到剪切板。

然后运行你的程序,它就会找到你所设定好的电话号码和E-mail地址,并且替换掉剪切板中的文本,那你是否会因此而感到效率大大提升呢?

天大灰狼就来和大家聊一下利用Python来进行特定文本的提取操作,这个操作将会从你电脑的剪切板上读取一段文本,并从该文本中提取出你想要得到的特定信息,并且再次复制到剪切板上。

之前大灰狼和大家讲过Python正则表达式的相关知识,不懂的小伙伴可以查看“Python教程之正则表达式(基础篇
)”和“Python教程之正则表达式(提高篇)
”。

那么在这一节中的实战项目里,将会是对正则表达式的一个最好的实战项目开发。

首先我们要调用Python的一个库文件pyperclip,使用该库文件的作用是让Python程序可以读取到电脑剪切板上的文本。

调用特定库文件:

import re, pyperclip

text = str(pyperclip.paste())

之后我们为电话号码创建一个正则表达式,我们知道我们最常见的电话号码是11位。

分别包括前三位的号码类型,比如是中国移动还是中国联通,中间四位的区号以及后四位的随机排版数字组成的。所以很多电话号码在书写的时候都是分为三部分,在中间使用空格点号或横杠来进行连接。

在这里插入图片描述
那么我们就要对不同类型的电话号码进行提取,因此我们在创建正则表达式的时候,要首先对前三位数字建立匹配(\d{3}|(\d{3})),再对中间可能出现的空格点号或横杠来进行表示([-.\s])。

之后对四位区号数字进行正则表达式匹配(\d{4}|(\d{4})),再进行中间出现的空格点号或横线([-.\s]),最后匹配随机排版的四位数字(\d{4}|(\d{4}))。

同时,我们在正则表达式的最后调用函数re.VERBOSE,该函数的作用是编写注释,所以我们为电话号码创建的正则表达式应该是这样的:

创建电话号码的正则表达式:

telRegex=re.compile(r'''(\d{3}|\(\d{3}\))

([-.\s])

(\d{4}|\(\d{4}\))

([-.\s])

(\d{4}|\(\d{4}\))''', re.VERBOSE)

之后我们为电子邮箱E-mail创建正则表达式,同样我们知道E-mail地址的用户部分是一个或多个字符字符,可以包括小写和大写字母数字句点下划线百分号加号或短横,所以我们可以将这些所有放入一个字符分类中[\w\d._%±]。

域名和用户名用@符号分割。

域名允许的字符分类要少一些,只允许字母数字句点和短横[\w\d._%±]。

最后是部这在技术上称为顶级域名,并且有2到4个字符.[\w]{2,4}。

所以我们建立的电子邮箱正则表达式应该是这样的;

创建E-mail的正则表达式:

mailRegex = re.compile(r'''[\w\d._%+-]+

@

[\w\d._%+-]+

\.[\w]{2,4}''', re.VERBOSE | re.I)

在我们创立好电话号码和电子邮箱的正则表达式以后,我们就应该对剪切板上得到的文本进行匹配,在这里我们可以建立一个列表来存储的电话号码和电子邮箱:

建立marches列表:

marches = []

首先我们对整个文本进行for循环遍历,找到其中符合电话号码要求的文本,由于通过正则表达式匹配后返回的文本是分段呈现的。

所以我们只需要在列表中存储电话号码的数字部分即可,然后将每次遍历得到的结果存储到列表中:

for循环提取特定的电话号码:

for grops in telRegex.findall(text):

    telNum = '-'.join([grops[0], grops[2], grops[4]])

    marches.append(telNum)

之后再次调用for循环遍历整个文本,读取到文本中符合电子邮箱正则表达式的文本,并将其文本存入到列表marches中。

当for循环进行完毕以后,我们就将整个文本中的电话号码和电子邮箱完全的存放到了列表之中。

for循环提取特定的E-mail地址:

for grops in mailRegex.findall(text):

    marches.append(grops)

这时候我们需要将存储到的信息以换行符进行分割,并且存放到剪切板上。这时候我们需要调用的函数是pyperclip库下的copy函数:

复制获取的文本到剪切板:

pyperclip.copy('\n'.join(marches))

当我们将程序编写完毕以后,将程序以python脚本的形式进行保存。

不了解python脚本的小伙伴,可以阅读大灰狼的这篇文章“Python搭建脚本环境,配置path环境变量设置超详细步骤”

当我们保存完毕以后,从包含电话号码和电子邮箱的文本中进行复制,然后运行脚本再进行粘贴,就可以提取到特定的电话号码和电子邮箱了!

完整源码

最后附上完整源码:

import re, pyperclip
#! python3
text = str(pyperclip.paste())

#创建tel的正则表达式
telRegex = re.compile(r'''(\d{3}|\(\d{3}\))
([-.\s])
(\d{4}|\(\d{4}\))
([-.\s])
(\d{4}|\(\d{4}\))''', re.VERBOSE)

#创建E-mail的正则表达式
mailRegex = re.compile(r'''[\w\d._%+-]+
@
[\w\d._%+-]+
\.[\w]{2,4}''', re.VERBOSE | re.I)

marches = []
for grops in telRegex.findall(text):
    telNum = '-'.join([grops[0], grops[2], grops[4]])
    marches.append(telNum)

for grops in mailRegex.findall(text):
    marches.append(grops)

pyperclip.copy('\n'.join(marches))
print('\n'.join(marches))

程序不难但的确很有用,

通过这样一个程序,我们就可以从不同的文本中提取不同的特定字符,这就大大的缩短了我们在篇幅较长的文本中寻找特定内容的时间和精力,同时也为我们的办公提高了效率!

觉得有用记得关注分享!灰小猿陪你一起进步!

(完)