2021-11-06 正则表达式总结
掌握正则表达式
1 正则表达式的7个境界
1.1 level1_固定的字符串
要求:确定字符串中是否有123456
import retext = '张三身高:199,体重300,学号123456,密码936'
print(re.findall(r'123456', text))
==================================================
运行结果:
['123456']
代码说明:
- 第1行,引入正则表达式模块re
- 第3行,使用re的findall()方法找到所有符合模式的字符串,这里的模式就是123456,也就是说找到字符串中所有的123456
- findall()方法的第1个参数是模式,第2个参数是要查找的字符串
- 模式中会有一些特殊字符,所以用r表示这是一个raw字符串,让Python不要去转义里面的特殊字符
上面程序的运行结果是:[123456],因为整个字符串中就1个123456
level1就是一个固定的字符串匹配,可以用传统的字符串匹配解决
1.2 level2_某一类字符
要求:找出所有的单个的数字
text = '张三身高:199,体重300,学号123456,密码936'
print(re.findall(r'\d', text))
==================================================
运行结果:
['1', '9', '9', '3', '0', '0', '1', '2', '3', '4', '5', '6', '9', '3', '6']
这个表达式\d表示所有的数字,所以1,7,8,1,6,8等都可以匹配到。这是很简单的模式,只匹配1个单独的数字
找1到5的数字
text = '张三身高:199,体重300,学号123456,密码936'
print(re.findall(r'[1-5]', text))
==================================================
运行结果:
['1', '3', '1', '2', '3', '4', '5', '3']
找“一”,“重”,“号”这三个字
text = '张三身高:199,体重300,学号123456,密码936'
print(re.findall(r'[一重号]', text))
==================================================
运行结果:
['重', '号']
1.3 level3_重复某一类字符
要求:找所有的数字,比如178,168,123456,9527等
text = '张三身高:199,体重300,学号123456,密码936'
print(re.findall(r'\d+', text))
==================================================
运行结果:
['199', '300', '123456', '936']
这个模式\d+在\d的后面增加了+号,表示数字可以出现1到多次,所以199等都符合它的要求
匹配2到4个数字
text = '1张三23身高:199,体重300,学号123456,密码936'
print(re.findall(r'\d{2,4}', text))
==================================================
运行结果:
['23', '199', '300', '1234', '56', '936']
1.4 level4_组合level2
要求:找出座机号码
text = '张三的电话是12345678901,他还有一个电话10987654321,他喜欢0123456,他的座机:1234-1234567'
print(re.findall(r'\d{4}-\d{7}', text))
==================================================
运行结果:
['1234-1234567']
\d{4}-\d{7}这是一个组合的模式,表示前面4个数字,中间一个横杠,后面7个数字
1.5 level5_多种情况
要求:找出手机号码或者座机号码
text = '张三的电话是12345678901,他还有一个电话10987654321,他喜欢0123456,他的座机:1234-1234567'
print(re.findall(r'\d{4}-\d{7}|1\d{10}', text))
==================================================
运行结果:
['12345678901', '10987654321', '1234-1234567']
比上面有复杂了点,因为使用竖线(|)来表示”或“的关系,就是手机号码和电话号码都可以
1.6 level6_限定位置
要求:在句子开头的手机号码,或座机
text = '4321-7654321不是张三的,张三的电话是12345678901,他还有一个电话10987654321,他喜欢0123456,他的座机:1234-1234567'
print(re.findall(r'^\d{4}-\d{7}|^1\d{10}', text))
==================================================
运行结果:
['4321-7654321']
在表达式的最开始使用了^符号,表示一定要在句子的开头才行。这时候只有4321-7654321能匹配上
1.7 level7_内部约束
要求:找出形如barbar, dardar的前后三个字母重复的字符串
text = 'abc1abc,qweqwe,zxccxz,poipoi'
print(re.findall(r'(\w{3})(\1)', text))
==================================================
运行结果:
[('qwe', 'qwe'), ('poi', 'poi')]
\w{3}表示3个字符,放在小括号中(\w{3})就成为一个分组,而后面的(\1)表示它里面的内容和第1个括号里的内容必须相同,其中的1就表示第1个括号,也就是说3个字符要重复出现两次
2 写正则表达式的套路
如何写正则表达式呢?我总结了几个步骤。不管多复杂,基本上都百试不爽
我们仍然以包含分机号码的座机电话号码为例,比如0571-88776655-9527,演示下面的步骤:
- 确定模式包含几个子模式
它包含3个子模式:0571-88776655-9527。这3个子模式用固定字符连接 - 各个部分的字符分类是什么
这3个子模式都是数字类型,可以用\d。现在可以写出模式为:\d-\d-\d - 各个子模式如何重复
第1个子模式重复3到4次,因为有010和021等直辖市
第2个子模式重复7到8次,有的地区只有7位电话号码
第3个子模式重复3-4次
加上次数限制后,模式成为:\d{3,4}-\d{7,8}-\d{3,4}
但有的座机没有分机号,所以我们用或运算符让它支持两者:
\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8} - 是否有外部位置限制
没有 - 是否有内部制约关系
没有
经过一通分析,最后的正则就写成了,测试一下:
text = '随机数字:01234567891,座机1:0571-52152166,座机2:0571-52152188-1234'
print(re.findall(r'\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}', text))
==================================================
运行结果:
['0571-52152166', '0571-52152188-1234']
最后的结果是:两个座机都可以找出来
3 正则表达式的语法分类
正则表达式几十个符号,看似很复杂,但如果能否分清楚类别和作用,就没那么复杂了
- 字符类别表达——表达某一类字符,比如数字,字母,3到9之间的任何数字等
- 字符的重复次数,也叫做量词。比如身份证是数字重复15或18次,也就是:\d{15}或者\d{18}
- 组合模式,把多个简单的模式组合在一起,可以是拼接,也可以是二者选其一
- 位置,限定模式出现的位置,比如行首,行尾,或者在特定字符之后等
- 分组,把一个正则表达式分成几个部分,这样可以重复某个分组,或者指定两个分组必须相同等额外的要求
- 其他
4 Python的re模块学习
python的re模块还比较简单,包括以下几个方法:
- re.search():查找符合模式的字符,只返回第一个,返回Match对象
- re.match():和search一样,但要求必须从字符串开头匹配
- re.findall():返回所有匹配的字符串列表
- re.finditer():返回一个迭代器,其中包含所有的匹配,也就是Match对象
- re.sub():替换匹配的字符串,返回替换完成的文本
- re.subn():替换匹配的字符串,返回替换完成的文本和替换的次数
- re.split():用匹配表达式的字符串做分隔符分割原字符串
- re.compile():把正则表达式编译成一个对象,方便后面使用
5 正则表达式的语法清单
下面我举了更多的例子,供大家练习和熟悉
建议先自己尝试去写出相关的正则表达式,再回来看下面的参考答案
- 匹配Email地址的正则表达式
- 匹配网址URL的正则表达式
- 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
- 匹配国内电话号码(0571-87655322,001-87666622,920-209642-964)
- 匹配腾讯qq号
- 匹配中国邮政编码(6位数字)
- 匹配身份证(15位或18位)
- 匹配ip地址
- 形如"carcar"或"barbar"等会重复的三个字符的单词
- 获取以"密码:"开头的数字
现在来看参考答案:
- 匹配Email地址的正则表达式:
\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*
- 匹配网址URL的正则表达式:
[a-zA-z]+://[^s]*
- 匹配帐号是否合法(字母开头,允许5-16字母,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 匹配国内电话号码,格式为:区号-号码-分机号,分机号可能没有:
d{3,4}-d{7,8}-d{3,4}|d{3,4}-d{7,8}
- 匹配腾讯qq号:
[1-9][0-9]{4,}
- 匹配中国邮政编码(6位数字):
[1-9]\d{5}(?!\d)
- 匹配身份证(15位或18位):
\d{15}|\d{18}
- 匹配ip地址:
\d+.\d+.\d+.\d+
- 形如"carcar"或"barbar"等会重复的三个字符的单词:
(\w{3})(\1)
- 获取以"密码:"开头的数字:
(?<=密码.)\d+
6 汇总
2021-11-06 正则表达式总结相关推荐
- 2021.11.06总结
这周一直在刷搜索和dp的题,偶尔碰见dp加搜索的综合题,还打了一场cf,虽然结果不太好,差一点c就出了.自己有点菜,还需慢慢变强 P1052 过河 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳 ...
- Interview:算法岗位面试—11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码、项目考察、比赛考察、图像算法的考察等
Interview:算法岗位面试-11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码.项目考察.比赛考察.图像算法的考察等 导读:该公司是在同济某次大型招聘会上投的,当时和HR聊了半个多 ...
- 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,
2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔
- Daily Report 2012.11.06 刘宇翔
今天对李忠修改过的match函数进行测试,修正bug,并进行优化. 将中文分词方法加入到算法中,提高了算法的精确度. 但中文分词方法加入到算法后,出现在一些新问题,对新出现的问题进行了修正和优化. 测 ...
- 读论文——Pre-Training with Whole Word Masking for Chinese BERT(2021 11.25)
第一遍 标题以及作者(2021 11.25) 摘要 本文基于BERT,在RoBERTa上进行一系列改进,提出了用于中文的预训练模型MacBERT. 提出了一种新的掩码策略,MLM as correct ...
- 首页推荐流支持快捷修改兴趣标签,问答支持展示gif【2021.11.8】
hello,大家好,这里是「CSDN产品周报」第17期.本次更新主要涉及首页和问答两个产品模块,具体细节请往下看. 一.首页优化 1.「推荐」信息流新增「修改兴趣标签」按钮 从用户需求的角度考虑,对内 ...
- 【报告分享】小红书平台2021 11.11期间行业投放分析报告-千瓜数据(附下载)
摘要:随着平台多元化发展,用户体量增加,小红书逐渐拥抱了更多的年轻用户群体,也给更多的品牌带来了增长机会.据小红书方透露,2021年小红书平台的单日笔记曝光已经超100亿次,且男性用户占比已经达到了3 ...
- 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验
篇章一:行业经验 不同的AI公司,对于AI产品的场景定位不同. 有的公司是面向C端产品.有的公司专门做B端用户. 当然大白所在的公司,也有具体的定位,主要面向智慧金融.智慧机场.智慧城市. 之前,一直 ...
- 第13期微生物组-宏基因组分析(线上/线下同时开课,2021.11)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...
- 【不忘初心】Win10_LTSC2021_19044.1381_X64_可更新[纯净精简版][2.52G](2021.11.20)
此版可正常更新补丁,母版来自UUP WIN10_LTSC2021 19044.1288集成补丁到19044.1381为了保证稳定初心的系统全部都是离线精简和优化,非二次封装.系统纯净.流畅.进程少无任 ...
最新文章
- LSTM之父,现已加入鬼畜全明星,“他为啥没得图灵奖,太不公平了!”
- WCF基础 (续 暴露元数据交换节点)
- java事件处理过程分布写_Java 9中的进程处理
- HashMap——ConcurrentHashMap
- html中超链接无效怎么办,超链接问题:“引用无效”怎么回事
- 关于Mysql修改密码的方法汇总
- 印尼玩lol注册哪个服务器,LOL手游印尼服怎么注册 云顶之弈印尼服账号注册方法[多图]...
- java电信面试问题及答案_大唐电信java笔试题及答案
- CPU工作方式、多核心、超线程技术详解[转贴]
- 【书影观后感 八】《周期》万事皆周期
- 数据结构--算术表达式求值
- 虚拟机linux ecap文件在,为AM335x移植Linux内核主线代码(30)eCAP的PWM波功能
- MOS管的行业应用领域-KIA MOS管
- Vibrant Ink Theme for IntelliJ IDEA
- 2020年Q3房产行业网络关注度分析报告
- 【Python量化策略】SMA双均线策略
- 基于java实现的分词以及词频统计,准备制作词云数据
- 远程往服务器上传送文件,服务器远程传送文件
- AIX 学习笔记之 存储管理 LV PV VG PP
- Linux下安装安装redis
热门文章
- 南京大计算机系学郑国梁,一个基于层次结构的DSM模型-南京大学计算机科学与技术系.PDF...
- 查找排序二叉树的最小值,最大值,Next指针,并逆序打印
- oracle 三张表差集,oracle交集并集差集 oracle取两张表并集
- 国内服务器安装ServerStatus探针
- 体育时空杂志体育时空杂志社体育时空编辑部2015年第2去i部分目录
- Android markdown富文本渲染解析实现
- 我的世界java版移除猪灵了吗_我的世界:还不知道怎么对付猪灵?有些小技巧只有老玩家知道...
- 为什么B站中的弹幕可以不遮挡人物
- dedecms v5.7 整合discuz x3.2 双向同步登录退出
- 盘点|12款服务器监控工具