掌握正则表达式

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 正则表达式总结相关推荐

  1. 2021.11.06总结

    这周一直在刷搜索和dp的题,偶尔碰见dp加搜索的综合题,还打了一场cf,虽然结果不太好,差一点c就出了.自己有点菜,还需慢慢变强 P1052 过河 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳 ...

  2. Interview:算法岗位面试—11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码、项目考察、比赛考察、图像算法的考察等

    Interview:算法岗位面试-11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码.项目考察.比赛考察.图像算法的考察等 导读:该公司是在同济某次大型招聘会上投的,当时和HR聊了半个多 ...

  3. 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,

    2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔

  4. Daily Report 2012.11.06 刘宇翔

    今天对李忠修改过的match函数进行测试,修正bug,并进行优化. 将中文分词方法加入到算法中,提高了算法的精确度. 但中文分词方法加入到算法后,出现在一些新问题,对新出现的问题进行了修正和优化. 测 ...

  5. 读论文——Pre-Training with Whole Word Masking for Chinese BERT(2021 11.25)

    第一遍 标题以及作者(2021 11.25) 摘要 本文基于BERT,在RoBERTa上进行一系列改进,提出了用于中文的预训练模型MacBERT. 提出了一种新的掩码策略,MLM as correct ...

  6. 首页推荐流支持快捷修改兴趣标签,问答支持展示gif【2021.11.8】

    hello,大家好,这里是「CSDN产品周报」第17期.本次更新主要涉及首页和问答两个产品模块,具体细节请往下看. 一.首页优化 1.「推荐」信息流新增「修改兴趣标签」按钮 从用户需求的角度考虑,对内 ...

  7. 【报告分享】小红书平台2021 11.11期间行业投放分析报告-千瓜数据(附下载)

    摘要:随着平台多元化发展,用户体量增加,小红书逐渐拥抱了更多的年轻用户群体,也给更多的品牌带来了增长机会.据小红书方透露,2021年小红书平台的单日笔记曝光已经超100亿次,且男性用户占比已经达到了3 ...

  8. 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验

    篇章一:行业经验 不同的AI公司,对于AI产品的场景定位不同. 有的公司是面向C端产品.有的公司专门做B端用户. 当然大白所在的公司,也有具体的定位,主要面向智慧金融.智慧机场.智慧城市. 之前,一直 ...

  9. 第13期微生物组-宏基因组分析(线上/线下同时开课,2021.11)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...

  10. 【不忘初心】Win10_LTSC2021_19044.1381_X64_可更新[纯净精简版][2.52G](2021.11.20)

    此版可正常更新补丁,母版来自UUP WIN10_LTSC2021 19044.1288集成补丁到19044.1381为了保证稳定初心的系统全部都是离线精简和优化,非二次封装.系统纯净.流畅.进程少无任 ...

最新文章

  1. LSTM之父,现已加入鬼畜全明星,“他为啥没得图灵奖,太不公平了!”
  2. WCF基础 (续 暴露元数据交换节点)
  3. java事件处理过程分布写_Java 9中的进程处理
  4. HashMap——ConcurrentHashMap
  5. html中超链接无效怎么办,超链接问题:“引用无效”怎么回事
  6. 关于Mysql修改密码的方法汇总
  7. 印尼玩lol注册哪个服务器,LOL手游印尼服怎么注册 云顶之弈印尼服账号注册方法[多图]...
  8. java电信面试问题及答案_大唐电信java笔试题及答案
  9. CPU工作方式、多核心、超线程技术详解[转贴]
  10. 【书影观后感 八】《周期》万事皆周期
  11. 数据结构--算术表达式求值
  12. 虚拟机linux ecap文件在,为AM335x移植Linux内核主线代码(30)eCAP的PWM波功能
  13. MOS管的行业应用领域-KIA MOS管
  14. Vibrant Ink Theme for IntelliJ IDEA
  15. 2020年Q3房产行业网络关注度分析报告
  16. 【Python量化策略】SMA双均线策略
  17. 基于java实现的分词以及词频统计,准备制作词云数据
  18. 远程往服务器上传送文件,服务器远程传送文件
  19. AIX 学习笔记之 存储管理 LV PV VG PP
  20. Linux下安装安装redis

热门文章

  1. 南京大计算机系学郑国梁,一个基于层次结构的DSM模型-南京大学计算机科学与技术系.PDF...
  2. 查找排序二叉树的最小值,最大值,Next指针,并逆序打印
  3. oracle 三张表差集,oracle交集并集差集 oracle取两张表并集
  4. 国内服务器安装ServerStatus探针
  5. 体育时空杂志体育时空杂志社体育时空编辑部2015年第2去i部分目录
  6. Android markdown富文本渲染解析实现
  7. 我的世界java版移除猪灵了吗_我的世界:还不知道怎么对付猪灵?有些小技巧只有老玩家知道...
  8. 为什么B站中的弹幕可以不遮挡人物
  9. dedecms v5.7 整合discuz x3.2 双向同步登录退出
  10. 盘点|12款服务器监控工具