java 正则首位8或者9的8位数字_从零开始学Python - 第025课:正则表达式的应用

正则表达式相关知识

在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。

举一个简单的例子,如果你在Windows操作系统中使用过文件查找并且在指定文件名时使用过通配符(*?),那么正则表达式也是与之类似的用 来进行文本匹配的工具,只不过比起通配符正则表达式更强大,它能更精确地描述你的需求,当然你付出的代价是书写一个正则表达式比使用通配符要复杂得多,因为任何给你带来好处的东西都需要你付出对应的代价。

再举一个例子,我们从某个地方(可能是一个文本文件,也可能是网络上的一则新闻)获得了一个字符串,希望在字符串中找出手机号和座机号。当然我们可以设定手机号是11位的数字(注意并不是随机的11位数字,因为你没有见过“25012345678”这样的手机号),而座机号则是类似于“区号-号码”这样的模式,如果不使用正则表达式要完成这个任务就会比较麻烦。最初计算机是为了做数学运算而诞生的,处理的信息基本上都是数值,而今天我们在日常工作中处理的信息基本上都是文本数据,我们希望计算机能够识别和处理符合某些模式的文本,正则表达式就显得非常重要了。今天几乎所有的编程语言都提供了对正则表达式操作的支持,Python通过标准库中的re模块来支持正则表达式操作。

关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫《正则表达式30分钟入门教程》,读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。

c3e1180144b464bd18f1a8203fa3d7b2.png

2b7a088e50f0c87b9d63753e9d6722ce.png

3634e828836673d93afebd1659a0ddb0.png
说明: 如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用进行转义处理,例如想匹配小数点可以写成.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成(),否则圆括号被视为正则表达式中的分组。

Python对正则表达式的支持

Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。

72d18cdf69dd5ef7508d6f87fdd28427.png
说明: 上面提到的re模块中的这些函数,实际开发中也可以用正则表达式对象的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过compile函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。

下面我们通过一系列的例子来告诉大家在Python中如何使用正则表达式。

例子1:验证输入用户名和QQ号是否有效并给出对应的提示信息。

"""
要求:用户名必须由字母、数字或下划线构成且长度在6~20个字符之间,QQ号是5~12的数字且首位不能为0
"""
import reusername = input('请输入用户名: ')
qq = input('请输入QQ号: ')
# match函数的第一个参数是正则表达式字符串或正则表达式对象
# match函数的第二个参数是要跟正则表达式做匹配的字符串对象
m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
if not m1:print('请输入有效的用户名.')
# fullmatch函数要求字符串和正则表达式完全匹配
# 所以正则表达式没有写起始符和结束符
m2 = re.fullmatch(r'[1-9]d{4,11}', qq)
if not m2:print('请输入有效的QQ号.')
if m1 and m2:print('你输入的信息是有效的!')
提示: 上面在书写正则表达式时使用了“原始字符串”的写法(在字符串前面加上了r),所谓“原始字符串”就是字符串中的每个字符都是它原始的意义,说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方,如果不使用原始字符串就需要将反斜杠写作,例如表示数字的d得书写成d,这样不仅写起来不方便,阅读的时候也会很吃力。

例子2:从一段文字中提取出国内手机号码。

下面这张图是截止到2017年底,国内三家运营商推出的手机号段。

7cb42c56d30de6a4752306299b3f1521.png
import re# 创建正则表达式对象,使用了前瞻和回顾来保证手机号前后不应该再出现数字
pattern = re.compile(r'(?<=D)1[34578]d{9}(?=D)')
sentence = '''重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
不是15600998765,也是110或119,王大锤的手机号才是15600998765。'''
# 方法一:查找所有匹配并保存到一个列表中
tels_list = re.findall(pattern, sentence)
for tel in tels_list:print(tel)
print('--------华丽的分隔线--------')# 方法二:通过迭代器取出匹配对象并获得匹配的内容
for temp in pattern.finditer(sentence):print(temp.group())
print('--------华丽的分隔线--------')# 方法三:通过search函数指定搜索位置找出所有匹配
m = pattern.search(sentence)
while m:print(m.group())m = pattern.search(sentence, m.end())
说明: 上面匹配国内手机号的正则表达式并不够好,因为像14开头的号码只有145或147,而上面的正则表达式并没有考虑这种情况,要匹配国内手机号,更好的正则表达式的写法是:(?<=D)(1[38]d{9}|14[57]d{8}|15[0-35-9]d{8}|17[678]d{8})(?=D),国内好像已经有19和16开头的手机号了,但是这个暂时不在我们考虑之列。

例子3:替换字符串中的不良内容

import resentence = 'Oh, shit! 你丫是傻叉吗? Fuck you.'
purified = re.sub('fuck|shit|[傻煞沙][比屄逼叉缺吊屌碉雕]','*', sentence, flags=re.IGNORECASE)
print(purified)  # Oh, *! 你丫是*吗? * you.
说明:re模块的正则表达式相关函数中都有一个flags参数,它代表了正则表达式的匹配标记,可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值,可以使用按位或运算符进行叠加,如flags=re.I | re.M

例子4:拆分长字符串

import repoem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
sentences_list = re.split(r'[,。, .]', poem)
sentences_list = [sentence for sentence in sentences_list if sentence]
for sentence in sentences_list:print(sentence)

简单的总结

正则表达式在字符串的处理和匹配上真的非常强大,通过上面的例子相信大家已经感受到了正则表达式的魅力,当然写一个正则表达式对新手来说并不是那么容易,但是很多事情都是熟能生巧,大胆的去尝试就行了,有一个在线的正则表达式测试工具相信能够在一定程度上帮到大家。

温馨提示:大家如果觉得这个专栏还不错,一定记得点赞收藏哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蝴蝶扇了一下翅膀,混沌就诞生了

科学无国界我们是知识的搬运工认真阅读下面的文章&#xff0c;并思考文末互动提出的问题&#xff0c;严格按照 互动&#xff1a;你的答案 格式在评论区留言&#xff0c;就有机会获得由四川人民出版社提供的优质科普书籍《未来科学简史》一本。我们耳熟能详的“蝴蝶效应”&#…

native.loadlibrary获取路径不对_【Python专题(三)】Python模块导入与路径管理

​前言Python项目的路径管理是一个让人头疼的问题。在写python项目的时候&#xff0c;明明 import了文件A&#xff0c;代码运行时却收到 ModuleNotFoundError&#xff0c;仔细一看&#xff0c;是引用路径不对&#xff0c;很是气人。又或者&#xff0c;当项目中出现了重名的pack…

前沿研究:21世纪工程领域的重大挑战 | 中国工程院院刊

本文选自中国工程院院刊《Engineering》2020年第7期作者&#xff1a;C.D. Mote Jr.来源&#xff1a;Engineering in the 21st Century: The Grand Challenges and the Grand Challenges Scholars Program[J].Engineering,2020,6(7):728-732.编者按近期&#xff0c;中国工程院外…

linux网站目录在哪_果核建站教程【二】环境安装与搭建第一个网站

有问题加群&#xff0c;一起讨论&#xff0c;一起学习群号&#xff1a;664592923昨天大家都能理解&#xff0c;那么今天我们就要进入实战教程咯。这节教程讲在本地搭建环境和安装程序。1本地环境的搭建之前有教程讲如何在Windows开启Linux系统&#xff0c;本来想直接让大家在Li…

北斗定位2.0版来了!普通人手机可用,全免费!

◎ 科技日报记者 张佳星1.0版解决快的问题&#xff0c;2.0版解决又快又准的问题&#xff0c;是1.0基础上的一个巨大升级&#xff01;10月14日&#xff0c;在北斗卫星导航系统高峰论坛上&#xff0c;中国信息通信研究院&#xff08;下简称“信通院”&#xff09;发布了北斗高精度…

做出明智的决策

无处不在的决策 在我们的一生中&#xff0c;会做出无数的决定或决策&#xff0c;有关于个人生活的&#xff0c;也有工作专业相关的&#xff0c;这发生在我们的每一天中。在这些决策中&#xff0c;有一些无关紧要&#xff0c;有一些却会产生长期影响&#xff0c;乃至导致颠覆性的…

如何看打印机的缓存区域_松下打印机好吗 松下打印机卡纸如何解决【详解】...

现在人们早已习惯了用手机记录下生活中的美好事物&#xff0c;因此拥有一台能打印照片的打印机成为这些人的选择&#xff0c;可随着现在人们对于打印机的需求量在不断的增加&#xff0c;市面上的打印机品牌也随之增多了起来。那么松下 打印机怎么样&#xff0c;松下打印机使用过…

Linux 蓝牙读写,实战Linux Bluetooth编程(三) HCI层编程

作者&#xff1a;Sam (甄峰)(HCI协议简介&#xff0c;HCI 在BlueZ中的实现以及HCI编程接口)1. HCI层协议概述&#xff1a;HCI提供一套统一的方法来访问Bluetooth底层。如图所示&#xff1a;从图上可以看出&#xff0c;Host Controller Interface(HCI) 就是用来沟通Host和Modul…

碰疼了会躲!这个植入“迷你大脑”的AI机器人,可感知疼痛,还能自我愈合...

来源&#xff1a;雷锋网人类为什么会产生痛觉&#xff1f;没错&#xff0c;是因为大脑中枢神经。和触觉、温度等感觉一样&#xff0c;我们对疼痛非常敏感&#xff0c;当受到外界“轻微”刺激时&#xff0c;体内的神经元产生相应的信号&#xff0c;并传输至大脑中的中枢神经系统…

哈佛大学惊人发现:新冠对人类未来影响巨大!

来源&#xff1a;北美观察家近日&#xff0c;哈佛大学公共卫生学院发了一篇Science&#xff1a;根据论文中的描述&#xff0c;无论是否能研发出疫苗&#xff0c;新冠病毒都可能会陪伴人类到2025年。那么&#xff0c;2025年以后人类能摆脱新冠病毒吗&#xff1f;不&#xff0c;只…

服务的分类与启动

一、服务的分类 查询已安装的服务 RPM包安装的服务 [rootbogon ~]# chkconfig --list# 查看服务自启动状态&#xff0c;可以看到所有RPM包安装的服务 # 此命令不可以查看源码包安装的服务 注&#xff1a;1、2、3、4、5、6是运行级别 源码包安装的服务 查看服务安装位置&#xf…

在Linux里awk与sed的区别,linux awk和sed讲解

sed 工具简介在了解了一些正规表示法的基础应用之后&#xff0c;再来呢&#xff1f;呵呵&#xff5e;两个东西可以玩一玩的&#xff0c;那就是 sed 跟 awk 了&#xff01;这两个家伙可是相当的有用的啊&#xff01;举例来说&#xff0c;鸟哥写的 logfile.sh 分析登录文件的小程…

python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者

编程里面的编辑器就像是武林大会里面的高手&#xff0c;每一年都有新秀&#xff0c;黑马出现&#xff01;比如有练习霸道的天罡之气的榜首Pycharm&#xff0c;力量雄厚霸道战斗力极强&#xff0c;但是对斗气消耗很大&#xff0c;占内存大而且启动速度有点慢&#xff01;还有练习…

因果解释能够对规则进行解释吗?

来源&#xff1a;《哲学动态》2017年第10期作者&#xff1a;初维峰&#xff08;西安交通大学人文社会科学学院&#xff09;本文受中国博士后科学基金面上资助项目“当代西方因果解释理论研究”(2017M613160)资助。在现实生活中&#xff0c;我们不仅要对某一事件进行解释&#x…

okhttp post json 数据_使用python抓取App数据

App中的数据可以用网络爬虫抓取么答案是完全肯定的&#xff1a;凡是可以看到的APP数据都可以抓取。下面我就介绍下自己的学习经验和一些方法吧 本篇适合有过web爬虫基础的程序猿看没有的的话学的可能会吃力一些App接口爬取数据过程使用抓包工具手机使用代理&#xff0c;app所有…

JS的typeof力所能及已经力所不及

typeof返回值列表 typeof的作用 返回参数的类型 typeof能判断的类型 String类型: typeof a stringUndefined类型: typeof undefined undefinedBoolean类型: typeof true booleanNumber类型: typeof 22 numberSymbol类型: typeof Symbol() symbolFunction类型:typeof funct…

忆阻器类脑芯片与人工智能

来源&#xff1a;文章转载自期刊《微纳电子与智能制造》作者&#xff1a;陈子龙&#xff0c;程传同&#xff0c;董毅博&#xff0c;张 欢&#xff0c;张恒杰&#xff0c;毛旭瑞&#xff0c;黄北举&#xff0c;谢谢。摘 要现阶段计算与存储分离的“冯诺依曼”体系在功耗和速率方…

linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库

Linux(ubuntu系统)下使用FreeImage库Linux(ubuntu系统)下使用FreeImage库最近在搞一个图像处理的项目&#xff0c;需要用到FreeImage&#xff0c;之前在Windows下用过&#xff0c;很简单&#xff0c;因为FreeImage官网提供了可供使用的静态库动态库&#xff0c;直接包含就行了。…

UWP Composition API - PullToRefresh

UWP Composition API - PullToRefresh 原文:UWP Composition API - PullToRefresh背景&#xff1a; 之前用ScrollViewer 来做过 PullToRefresh的控件&#xff0c;在项目一些特殊的条件下总有一些问题&#xff0c;比如ScrollViewer不会及时到达指定位置。于是便有了使用Composit…

从城市治理到城市“智”理,AI 不仅是城市管理的“眼睛”

来源&#xff1a;帮尼资讯部分参考来源&#xff1a;中国安防行业网&#xff0c;图片来源网络近年来&#xff0c;随着计算机视觉技术的长足进步&#xff0c;AI在城市管理领域广泛部署。其中&#xff0c;AI视频分析识别技术成为城市场景中规模最大、数量最多、落地最广泛的应用。…