<automate the boring stuff with python>---第七章 正则实例&正则贪心&匹配电话号码和邮箱
第七章先通过字符串查找电话号码,比较了是否使用正则表达式程序的差异,明显正则写法更为简洁、易扩展。
模式:3 个数字,一个短横线,3个数字,一个短横线,再是4 个数字。例如:415-555-4242
import re
'''
不用正则查找模式,匹配3个数字,1个短横线,3个数字,1个短横线,4个数字
ex. 111-222-3334
''' def isPhoneNo(text):
if len(text) != 12:
return False
for i in range(0,3):
if not text[i].isdecimal():
return False
if text[3] != '-':
return False
for i in range(4,7):
if not text[i].isdecimal():
return False
if text[7] != '-':
return False
for i in range(8,12):
if not text[i].isdecimal():
return False
return True '''
用正则表达式匹配上述模式
'''
def regPhoneNo(text):
phoneNoReg=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
res=phoneNoReg.search(text)
if res != None:
print('phone No find by reg: '+ res.group()) print(isPhoneNo('123-122-9090'))
print(isPhoneNo(''))
msg = 'call me at 415-443-1111 tomorrow. 415-443-2222 is my office'
for i in range(len(msg)):
tmp = msg[i:i+12]
if isPhoneNo(tmp):
print('phone No find: ' + tmp)
regPhoneNo(tmp)
print('msg find end')
Python 的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。
花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号
实例:
'''
例子说明Python的贪心和非贪心匹配结果
'''
def showGreedReg():
greedReg=re.compile(r'(ha){3,5}')
nonGreedReg=re.compile(r'(ha){3,5}?')
inp='hahahahahah'
r1=greedReg.search(inp)
r2=nonGreedReg.search(inp)
print('greed reg res: '+r1.group())
print('nongreed reg res: '+r2.group()) showGreedReg()
第7章的项目为电话号码和邮箱的正则提取,剪切板部分此处省略。
import pyperclip, re
phoneReg=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}))?
)''', re.VERBOSE
) emailReg=re.compile(r'''(
[a-zA-Z0-9_-]+ #username
@ #@
[a-zA-Z0-9_-]+ #domain name
(\.[a-zA-Z]{2,4})
)''', re.VERBOSE
)
电话号码从一个“可选的”区号开始,所以区号分组跟着一个问号。
因为区号可能只是3 个数字(即\d{3}),或括号中的3 个数字(即\(\d{3}\)),所以应该用管道符号连接这两部分。
可以对这部分多行字符串加上正则表达式注释# Area code,帮助你记忆(\d{3}|\(\d{3}\))?要匹配的是什么。
电话号码分割字符可以是空格(\s)、短横(-)或句点(.),所以这些部分也应该用管道连接。
这个正则表达式接下来的几部分很简单:3 个数字,接下来是另一个分割符,接下来是4 个数字。
最后的部分是可选的分机号,包括任意数目的空格,
接着ext、x 或ext.,再接着2 到5 位数字。
E-mail 地址的用户名部分是一个或多个字符,字符可以包括:小写和大写字母、数字、句点、下划线、百分号、加号或短横。
可以将所有这些放入一个字符分类:[a-zA-Z0-9._%+-]。
域名和用户名用@符号分割,域名允许的字符分类要少一些,只允许字母、数字、句点和短横:[a-zA-Z0-9.-]。
最后是“dot-com”部分(技术上称为“顶级域名”),它实际上可以是“dot-anything”。它有2 到4 个字符。
re.VERBOSE,忽略正则表达式字符串中的空白符和注释
至此,第七章内容结束,实践项目 强口令检测 见下期博客
<automate the boring stuff with python>---第七章 正则实例&正则贪心&匹配电话号码和邮箱的更多相关文章
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- <automate the boring stuff with python> 正则强口令实例
书中7.18的强口令实践题 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是: 长度不少于8 个字符,同时包含大写和小写字符,至少有一位数字. 你可能需要用多个正则表达式来测 ...
- Python第七章(北理国家精品课 嵩天等)
7.1文件的使用 1.1文本类型 文本文件:由单一特定编码组成的文件,如.txt 二进制文件:如.png,.avi 1.2文件的打开和关闭 打开-操作-关闭 <变量名> = open(&l ...
- python第七章:常用模块--小白博客
yagmail模块 python标准库中发送电子邮件的模块比较复杂,因此,有许多开原的库提供了更加易用的接口来发送电子邮件,其中yagmail是一个使用比较广泛的开原项目,yagmail底层依然使用了 ...
- 流畅的python第七章函数装饰器和闭包学习记录
本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...
- Python第七章-面向对象
面向对象编程基础 一.面向对象概念 1.1 什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 生活中的的例子举例. 1.2 ...
- Python第七章-面向对象高级
面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...
- Vue.js-07:第七章 - Vue 实例的生命周期
一.前言 在之前的 Vue 学习中,我们在使用 Vue 时,都会创建一个 Vue 的实例,而每个 Vue 实例在被创建时都要经过一系列的初始化过程.例如,需要设置数据监听.编译模板.将实例挂载到 D ...
- 【Flask】 python学习第一章 - 3.0 正则转换和错误捕捉
3.1正则转换器定义 Class RegexConverter(BaseConverter): regex = "[0-9]{6}" app.url_map.converters[ ...
随机推荐
- 从Go语言编码角度解释实现简易区块链
区块链技术 人们可以用许多不同的方式解释区块链技术,其中通过加密货币来看区块链一直是主流.大多数人接触区块链技术都是从比特币谈起,但比特币仅仅是众多加密货币的一种. 到底什么是区块链技术? 从金融学相 ...
- UNCTF杂项题Hidden secret 之NTFS交换数据流隐写
---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...
- Leetcode(10)正则表达式匹配
Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...
- linux下shell脚本启动jar包
本文采用的jar包是通过idea下maven打包的springboot项目. 写这个shell脚本是为了在linux下方便启动jar包时不用输入太多的shell命令,将启动脚本的一系列shell命令整 ...
- 函数基础(二)(day11整理)
目录 昨日内容 函数的定义 函数的三种定义方式 空函数 有参函数 无参函数 函数的调用 函数的返回值 函数的参数 形参 实参 今日内容 可变长参数 可变长形参 可变长实参(仅作了解) 函数对象 函数嵌 ...
- SQLServer执行大脚本文件时,提示“无法执行脚本没有足够的内存继续执行程序 (mscorlib)”
问题描述: 有时候服务器操作导入数据.sql,或者 当需求不可以直接备份整库还原时,往往通过导出数据库脚本的方式来部署-还原数据库表 但是当数据库导出脚本很大,用Microsoft SQL Serve ...
- (三)Kinect姿势识别
Kinect给我们内置了许多姿势如举手等,具体可参考枚举KinectGestures.Gestures,也可以通过Kinect姿势管理器,自定义姿势导入(坑较多,内置的基本够用了)也可以根据关节坐标自 ...
- Elasticsearch 知识点整理 一
极力推荐: 官网地址: https://www.elastic.co/guide/en/elasticsearch/reference/6.0 肺腑之言,学ES先学原生的语法,SpringData封装 ...
- (大模拟紫题) Luogu P1953 易语言
原题链接:P1953 易语言 (我最近怎么总在做大模拟大搜索题) 分别处理两种情况. 如果只有一个1或0 直接设一个cnt为这个值,每次输入一个新名字之后把数字替换成cnt,最后cnt++即可. 注意 ...
- LVS NAT模式实践
client:192.168.4.10/24 proxy:192.168.2.5/24 192.168.4.5/24 web1:192.168.4.100/24 web2:192.168.4.200/ ...