Python 正则表达式(匹配多个字符)- 寻找香烟smoke的故事

本文主要是介绍Python 正则表达式(匹配多个字符)- 寻找香烟smoke的故事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仅供学习,转载请注明出处

匹配多个字符

思考

  • 场景:胖子老板在写字板写了一大堆东西,判断是否存在smoke的语句,判断正确就可以送你一包烟。

前面篇章讲到了如何匹配单个字符,但是却不能完美解决胖子老板提出的这个问题。那么当然就要继续增加技能点,来解决这个问题啦。

匹配多个字符的相关格式

字符功能
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现1次或者无限次,即至少有1次
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}匹配前一个字符出现m次
{m,n}匹配前一个字符出现从m到n次

匹配前一个字符出现0次或者无限次,即可有可无: *

# 首先匹配一个单字符大写M来热热身
In [8]: re.match("M","M").group()                                              
Out[8]: 'M'# 当小写m来匹配大写M字符的时候,淡定报错
In [9]: re.match("m","M").group()                                              
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-a22cd8e2da84> in <module>
----> 1 re.match("m","M").group()AttributeError: 'NoneType' object has no attribute 'group' # 使用 [] 的方法,来同时匹配大小写m
In [10]: re.match("[mM]","M").group()                                          
Out[10]: 'M'In [11]:    # 再来匹配大小写 a到z 的字母,当然这也是匹配一个字符而已,那么怎么匹配多个字符呢?
In [11]: re.match("[a-zA-Z]","M").group()                                      
Out[11]: 'M'In [12]: # 增加一个 * 号,那样就可以匹配出多个大小写字母了。
In [13]: re.match("[a-zA-Z]*","Mmasd").group()                                 
Out[13]: 'Mmasd'# 如果不用 * 号,那么一个 [] 只能匹配一个字符,这里写了两个 [] ,那么当然就是匹配出两个字符了。
In [14]: re.match("[a-zA-Z][a-zA-Z]","Mmasd").group()                          
Out[14]: 'Mm'In [15]:     # 那么来想一下,使用大小写字母来匹配数字,肯定会报错。那么加个 * 号 会不会报错呢?
In [15]: re.match("[a-zA-Z]","123456").group()                                 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-68dd0d7f6c8c> in <module>
----> 1 re.match("[a-zA-Z]","123456").group()AttributeError: 'NoneType' object has no attribute 'group'# 从结果来看,是没有报错的。因为 * 号的原因就是匹配前面的字符是否存在0次,或者多次的情况。这次匹配就是0次,那么直接就返回空字符串了。
In [16]: re.match("[a-zA-Z]*","123456").group()                                
Out[16]: ''In [17]:     

匹配前一个字符出现1次或者无限次,即至少有1次: +

# 上面用 * 号的时候,匹配不到直接返回空字符串,则没有报错。
# 那么换成 + 号就报错了,因为 + 号是一定至少需要有一个字母来匹配的。
In [17]: re.match("[a-zA-Z]+","123456").group()                                
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-17-c8ba700cee8c> in <module>
----> 1 re.match("[a-zA-Z]+","123456").group()AttributeError: 'NoneType' object has no attribute 'group'# 那么改成 * 号,允许0次字母匹配。再加 \d 至少一个或者多个数字匹配,淡定OK
In [19]: re.match("[a-zA-Z]*\d+","123456").group()                             
Out[19]: '123456'In [20]:   

匹配前一个字符出现1次或者0次,即要么有1次,要么没有:?

有时候匹配一个字符不知道到底有没有的时候,就可以使用 ? 号处理,如下:

# 再最后增加一个下划线来匹配,淡定发现报错。
In [20]: re.match("[a-zA-Z]*\d+_","123456").group()                            
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-5266a50cf59d> in <module>
----> 1 re.match("[a-zA-Z]*\d+_","123456").group()AttributeError: 'NoneType' object has no attribute 'group'# 在下划线后面增加一个 ? 号,来设置不知道有没有下划线
In [21]: re.match("[a-zA-Z]*\d+_?","123456").group()                           
Out[21]: '123456'# 那么如果有下划线,就会把下划线匹配出来
In [22]: re.match("[a-zA-Z]*\d+_?","123456_").group()                          
Out[22]: '123456_'In [23]: re.match("[a-zA-Z]*\d+_?","123456_12312").group()                     
Out[23]: '123456_'In [24]:  

匹配一个 0 至 99 的数字:

# 如果直接匹配两个字符 [] [] ,那当然会报错
In [24]: re.match("[0-9][0-9]","1").group()                                    
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-24-b9459313bc26> in <module>
----> 1 re.match("[0-9][0-9]","1").group()AttributeError: 'NoneType' object has no attribute 'group'# 给第一个[] 设置 ?号,那么就可以判断可能不存在第一个字符,只有一个。
In [25]: re.match("[0-9]?[0-9]","1").group()                                   
Out[25]: '1'In [26]: re.match("[0-9]?[0-9]","11").group()                                  
Out[26]: '11'In [27]: re.match("[0-9]?[0-9]","99").group()                                  
Out[27]: '99'In [28]:   In [53]: re.match("[0-9]?\d","09").group()                                     
Out[53]: '09'

匹配前一个字符出现m次:{m}

需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线

# 首先匹配大小写字母,数字,下划线 使用 \w 即可
In [55]: re.match("\w","a").group()                                            
Out[55]: 'a'In [56]: re.match("\w","A").group()                                            
Out[56]: 'A'In [57]: re.match("\w","1").group()                                            
Out[57]: '1'In [58]: re.match("\w","_").group()                                            
Out[58]: '_'# 那么就是需要确定匹配多少个,这时候使用{ 8,20 } 即可匹配8到20位这个 \w  的字符了。
In [62]: re.match("\w{8,20}","123").group()                                    
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-62-24a5057f6d58> in <module>
----> 1 re.match("\w{8,20}","123").group()AttributeError: 'NoneType' object has no attribute 'group'In [63]:                                                                       In [63]: re.match("\w{8,20}","12345678").group()                               
Out[63]: '12345678'In [64]: re.match("\w{8,20}","12345678aAhjjhc____").group()                    
Out[64]: '12345678aAhjjhc____'In [65]:  

匹配出163的邮箱地址

@符号之前有4到20位大小写字符、数字、以及下划线,开头必须是字母,不能是下划线、数字。
正确 :fatboy@163.com
错误: 1ajsdhj@163.comm

In [68]: re.match('[a-zA-Z]\w{3,19}@163.com','fatboy@163.com').group()         
Out[68]: 'fatboy@163.com'In [69]:    In [70]: re.match('[a-zA-Z]\w{3,19}@163.com','1fatboy@163.com').group()        
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-70-020ba8a3bbe7> in <module>
----> 1 re.match('[a-zA-Z]\w{3,19}@163.com','1fatboy@163.com').group()AttributeError: 'NoneType' object has no attribute 'group'In [71]:     

寻找smoke的胖老板题目 - 使用findall方法

如下:

ajsdlka;sjd;lkjas;dlkujqoiueioujasldkasjlkdasdljkhalalksj;dla,msdmnas;lkdkasmdkl;amsx,.asjdklsomkeaskldjkalsjdklasmd,mxznjhsaioduoiwuasdjhkljasmnxnlkjsxhjalsdnkjlasbldkjnasdjnajsldnajlskdsmokeasjdlka;sjd;lkjasd;lkjasdsmokesmoke

问在这里面有多少个smoke?

In [86]: question = "ajsdlka;sjd;lkjas;dlkujqoiueioujasldkasjlkdasdljkhalalksj;...: dla,msdmnas;lkdkasmdkl;amsx,.asjdklsomkeaskldjkalsjdklasmd,mxznjhsaiod...: uoiwuasdjhkljasmnxnlkjsxhjalsdnkjlasbldkjnasdjnajsldnajlskdsmokeasjdlk...: a;sjd;lkjasd;lkjasdsmokesmoke"                                        In [87]: result = re.findall('smoke',question)                                 In [88]: print(len(result))                                                    
3In [89]: print(result)                                                         
['smoke', 'smoke', 'smoke']In [90]:    
13423234-562bf071aa22f9dd.gif
胖子老板:你哪里get到这个findall方法的,前面都没说啊

别着急,我后面继续写。

13423234-7907ae6344e86e8a.png

关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

这篇关于Python 正则表达式(匹配多个字符)- 寻找香烟smoke的故事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092188

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出