python练习——模式匹配与正则表达式

正则表达式

正则表达式,简称为regex,是文本模式的描述方法。例如,\d是一个正则表达式,表示一位数字. 摘自《python编程快速上手》

创建正则表达式对象

import re

所有正则表达式函数都在re模块中。使用re.compile()传入字符串,返回值是一个Regex对象。Regex对象使用search()方法匹配文本,返回一个Match()对象,Match对象有一个group()方法,返回被查找的字符串中的实际字符。假如有分组,可以使用group()方法获取所有的分组。

匹配规则

  • “ | ” 被称为管道,希望匹配多个表达式中一个时可以使用。
  • 利用findall()方法,找到所有匹配的地方。返回的是字符串列表
  • ?表示匹配这个问号之前的分组零次或一次
  • *意味着匹配零次或多次
  • +意味着匹配一次或多次
  • {}指明匹配的次数,{3,5}表明匹配3、4、5个实例。

字符分类

字符表示
\d0~9任意数字
\D除了0~9之外的任何字符
\w任何字母、数字或者下划线(可以理解为匹配单词)
\W除了任何字母、数字或者下划线
\s空格、制表符和换行符
\S除了空格、制表符和换行符

插入字符和美元字符【可以理解为限制首尾】

^插入字符表明必须发生在被查找文本开始处
$美元字符表示该字符串必须以这个正则表达式的模式结束

通配字符

.称为“通配符”,匹配除了换行符之外的所有字符。
向re.compile()中传入第二个参数re.DOTALL,可让. 匹配包括换行符之内的所有字符。

不区分大小写

re.compile( , re.I)或者是re.compile( , re.IGNOGECASE)

项目实战

在一篇网页或文章中,找到所有电话号码和邮件地址,有一个程序可以在剪贴板文本中查找电话和Email地址,只需要CTRL+A然后CTRL+C,然后运行程序,就会用找到电话号码和Email地址,替换掉剪贴板中的文本

分析
  • 从剪贴板中获取文本
  • 找到文本中的电话和Email
  • 粘贴掉剪贴板
行动方案

使用pyperclip模块复制和粘贴字符串
创建两个正则表达式
对两个正则表达式,找到所有匹配
将匹配好的字符串整理好格式,放在一个字符串中,用于粘贴
如果找不到,显示提示

项目代码:

import pyperclip,re

# 电话号码有12~15位,中间可能有分隔符
phoneRegex = re.compile(r'''(
    \d{3}|(\d{3}\))?    #区号
    (\s|-|.)?
    (\d{3})
    (\s|-|.)
    (\d{4})
    (\s*(ext|x|ext.)\s*(\d{2,5}))?
)''', re.VERBOSE)

emailRegex = re.compile(r'''
    [a-zA-z0-9._%+-]+   #用户名
    @
    [a-zA-z0-9.-]+      #域名
    (\.[a-zA-Z]{2,4})   #有一些可能会有顶级域名
''', re.VERBOSE)

# 在剪贴板中找到匹配
text = str(pyperclip.paste)
matches = []
for groups in phoneRegex.findall(text):
    # 1.3.5.8分别是区号,前3个数字,后4个数字和区号
    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])

# 将所有匹配连接成一个字符串,复制到粘贴板
if len(matches)>0 :
    pyperclip.copy('\n'.join(matches))
    print("粘贴板的粘贴:")
    print('\n'.join(matches))
else:
    print('没有找到电话号码或者Email')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值