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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import