匹配字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如search()、match()、findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。

re模块在使用时,需要先应用import语句引入,具体代码如下:

import re

如果在使用re模块时,没有将其引入,将抛出如图21所示的异常。

图21  未引入re模块异常

匹配字符串可以使用re模块提供的match()、search()和findall()等方法。

(1)使用match()方法进行匹配

match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None。其语法格式如下:

re.match(pattern, string, [flags])

参数说明:

l  pattern:表示模式字符串,由要匹配的正则表达式转换而来。

l  string:表示要匹配的字符串。

l  flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。

表5  常用标志

标    志

说    明

A或ASCII

对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配(仅适用于Python 3.x)

I或IGNORECASE

执行不区分字母大小写的匹配

M或MULTILINE

将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)

S或DOTALL

使用(.)字符匹配所有字符,包括换行符

X或VERBOSE

忽略模式字符串中未转义的空格和注释

例如,匹配字符串是否以“mr_”开头,不区分字母大小写,代码如下:

import re

pattern = r'mr_\w+'                        # 模式字符串

string = 'MR_SHOP mr_shop'                  # 要匹配的字符串

match = re.match(pattern,string,re.I)      # 匹配字符串,不区分大小写

print(match)                                  # 输出匹配结果

string = '项目名称MR_SHOP mr_shop'

match = re.match(pattern,string,re.I)      # 匹配字符串,不区分大小写

print(match)                                  # 输出匹配结果

执行结果如下:

<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>

None

从上面的执行结果中可以看出,字符串“MR_SHOP”以“mr_”开头,将返回一个Match对象,而字符串“项目名称MR_SHOP”没有以“mr_”开头,将返回“None”。这是因为match()方法从字符串的开始位置开始匹配,当第一个字母不符合条件时,则不再进行匹配,直接返回None。

Match对象中包含了匹配值的位置和匹配数据。其中,要获取匹配值的起始位置可以使用Match对象的start()方法;要获取匹配值的结束位置可以使用end()方法;通过span()方法可以返回匹配位置的元组;通过string属性可以获取要匹配的字符串。例如下面的代码:

import re

pattern = r'mr_\w+'                               # 模式字符串

string = 'MR_SHOP mr_shop'                      # 要匹配的字符串

match = re.match(pattern,string,re.I)          # 匹配字符串,不区分大小写

print('匹配值的起始位置:',match.start())

print('匹配值的结束位置:',match.end())

print('匹配位置的元组:',match.span())

print('要匹配的字符串:',match.string)

print('匹配数据:',match.group())

执行结果如下:

匹配值的起始位置: 0

匹配值的结束位置: 7

匹配位置的元组: (0, 7)

要匹配字符串: MR_SHOP mr_shop

匹配数据: MR_SHOP

图标 (35)

  实例07  验证输入的手机号码是否为中国移动的号码

在IDLE中创建一个名称为checkmobile.py的文件,然后在该文件中导入Python的re模块,再定义一个验证手机号码的模式字符串,最后应用该模式字符串验证两个手机号码,并输出验证结果,代码如下:

import re                                         # 导入Python的re模块

pattern = r'(13[4-9]\d{8})$|(15[01289]\d{8})$'

mobile = '13634222222'

match = re.match(pattern, mobile)              # 进行模式匹配

if match == None:                                # 判断是否为None,为真表示匹配失败

    print(mobile, '不是有效的中国移动手机号码。')

else:

    print(mobile, '是有效的中国移动手机号码。')

mobile = '13144222221'

match = re.match(pattern, mobile)               # 进行模式匹配

if match == None:                                 # 判断是否为None,为真表示匹配失败

    print(mobile, '不是有效的中国移动手机号码。')

else:

    print(mobile, '是有效的中国移动手机号码。')

运行实例,将显示如图22所示的结果。

图22  验证输入的手机号码是否为中国移动的号码

(2)使用search()方法进行匹配

search()方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,则返回Match对象,否则返回None。search()方法的语法格式如下:

re.search(pattern, string, [flags])

参数说明:

l  pattern:表示模式字符串,由要匹配的正则表达式转换而来。

l  string:表示要匹配的字符串。

l  flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。

例如,搜索第一个以“mr_”开头的字符串,不区分字母大小写,代码如下:

import re

pattern = r'mr_\w+'                              # 模式字符串

string = 'MR_SHOP mr_shop'                      # 要匹配的字符串

match = re.search(pattern,string,re.I)          # 搜索字符串,不区分大小写

print(match)                                      # 输出匹配结果

string = '项目名称MR_SHOP mr_shop'

match = re.search(pattern,string,re.I)          # 搜索字符串,不区分大小写

print(match)                                      # 输出匹配结果

执行结果如下:

<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>

<_sre.SRE_Match object; span=(4, 11), match='MR_SHOP'>

从上面的运行结果中可以看出,search()方法不仅仅是在字符串的起始位置搜索,其他位置有符合的匹配也可以进行搜索。

图标 (35)

  实例08  验证是否出现危险字符

在IDLE中创建一个名称为checktnt.py的文件,然后在该文件中导入Python的re模块,再定义一个验证危险字符的模式字符串,最后应用该模式字符串验证两段文字,并输出验证结果,代码如下:

import re                                    # 导入Python的re模块

pattern = r'(黑客)|(抓包)|(监听)|(Trojan)'       # 模式字符串

about = '我是一名程序员,我喜欢看黑客方面的图书,想研究一下Trojan。'

match = re.search(pattern, about)            # 进行模式匹配

if match == None:                                # 判断是否为None,为真表示匹配失败

    print(about, '@ 安全!')

else:

    print(about, '@ 出现了危险词汇!')

about = '我是一名程序员,我喜欢看计算机网络方面的图书,喜欢开发网站。'

match = re.match(pattern, about)               # 进行模式匹配

if match == None:                         # 判断是否为None,为真表示匹配失败

    print(about, '@ 安全!')

else:

    print(about, '@ 出现了危险词汇!')

运行实例,将显示如图23所示的结果。

图23  验证是否出现危险字符

(3)使用findall()方法进行匹配

findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。findall()方法的语法格式如下:

re.findall(pattern, string, [flags])

参数说明:

l  pattern:表示模式字符串,由要匹配的正则表达式转换而来。

l  string:表示要匹配的字符串。

l  flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。

例如,搜索以“mr_”开头的字符串,代码如下:

import re

pattern = r'mr_\w+'                            # 模式字符串

string = 'MR_SHOP mr_shop'                    # 要匹配的字符串

match = re.findall(pattern,string,re.I)      # 搜索字符串,不区分大小写

print(match)                                  # 输出匹配结果

string = '项目名称MR_SHOP mr_shop'

match = re.findall(pattern,string)            # 搜索字符串,区分大小写

print(match)                                 # 输出匹配结果

执行结果如下:

['MR_SHOP', 'mr_shop']

['mr_shop']

如果在指定的模式字符串中,包含分组,则返回与分组匹配的文本列表。例如,

import re

pattern = r'[1-9]{1,3}(\.[0-9]{1,3}){3}'     # 模式字符串

str1 = '127.0.0.1 192.168.1.66'               # 要配置的字符串

match = re.findall(pattern,str1)              # 进行模式匹配

print(match)

上面代码的执行结果如下:

['.1', '.66']

从上面的结果中可以看出,并没有得到匹配的IP地址,这是因为在模式字符串中出现了分组,所以得到的结果是根据分组进行匹配的结果,即“(\.[0-9]{1,3})”匹配的结果。如果想获取整个模式字符串的匹配,可以将整个模式字符串使用一对小括号进行分组,然后在获取结果时,只取返回值列表的每个元素(是一个元组)的第1个元素。代码如下:

import re

pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'         # 模式字符串

str1 = '127.0.0.1 192.168.1.66'                    # 要配置的字符串

match = re.findall(pattern,str1)                   # 进行模式匹配

for item in match:

    print(item[0])

执行结果如下:

127.0.0.1

192.168.1.66

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

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

相关文章

信息系统项目管理师0603:项目整合管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 文章目录 项目整合管理 — 考点总结(可直接理解记忆) 输入、输出、工具和技术 历年考题直接考输入,输出、工具和技术的有17年11月第34、35,19年5月第34、35,20年11月27、28,21年5月第26,28,21年11月第28,22年5月第25,22年11月第22考题 项目章程是正…

CasaOS玩客云安装全平台高速下载器Gopeed并实现远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Python的酒店客房入侵检测系统的设计与实现

基于Python的酒店客房入侵检测系统的设计与实现 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 酒店客房入侵管理界面 结合上文的结构搭建和用户需求&#xff0c;酒店客房入侵检测系统的…

【Unity Shader入门精要 第12章】屏幕后处理效果(一)

1. 原理和过程 屏幕后处理是绑定摄像机的&#xff0c;通过抓取当前摄像机渲染的图像作为 SrcTextrue&#xff0c;然后按需依次调用处理接口&#xff0c;对 SrcTexture 进行处理&#xff0c;最后将处理完成的 DstTexture 显示到屏幕上&#xff0c;整个过程的调度通过 C# 脚本完…

【机器学习】Adaboost: 强化弱学习器的自适应提升方法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Adaboost: 强化弱学习器的自适应提升方法引言Adaboost基础概念弱学习器与强学习…

【蓝桥杯嵌入式】 第六届国赛

目录 题目 配置 注意事项 代码 - 默写大师 EEPROM读写函数 LED驱动函数 ADC采集 上电初始化 LCD 按键 PWM互补输出 全部代码 hardware.c hardware.h control.c control.h main.c 题目 配置 注意事项 复制LCD的工程&#xff0c;先配置资源 --- 勾选完选项一…

CCIG 2024:合合信息文档解析技术突破与应用前景

目录 背景当前大模型训练和应用面临的问题训练Token耗尽训练语料质量要求高LLM文档问答应用中文档解析不精准 合合信息的文档解析技术1. 具备多文档元素识别能力2. 具备版面分析能力3. 高性能的文档解析4. 高精准、高效率的文档解析文档多板式部分示例 文档解析典型技术难点元素…

案例|开发一个美业小程序,都有什么功能

随着移动互联网的迅猛发展&#xff0c;美业连锁机构纷纷寻求数字化转型&#xff0c;以小程序为载体&#xff0c;提升服务效率&#xff0c;增强客户体验。 线下店现在面临的困境&#xff1a; 客户到店排队时间过长&#xff0c;体验感受差 新客引流难&#xff0c;老用户回头客…

基于EV54Y39A PIC-IOT WA的手指数量检测功能开发(MPLAB+ADC)

目录 项目介绍硬件介绍项目设计开发环境及工程参考总体流程图硬件基本配置光照传感器读取定时器检测逻辑 功能展示项目总结 &#x1f449; 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指数量检测功能开发 &#x1f449; Github: EmbeddedCamerata/PIC-IOT_finger_recognition 项…

Flutter基础 -- Dart 语言 -- 注释函数表达式

目录 1. 注释 1.1 单行注释 1.2 多行注释 1.3 文档注释 2. 函数 2.1 定义 2.2 可选参数 2.3 可选参数 默认值 2.4 命名参数 默认值 2.5 函数内定义 2.6 Funcation 返回函数对象 2.7 匿名函数 2.8 作用域 3. 操作符 3.1 操作符表 3.2 算术操作符 3.3 相等相关的…

上海亚商投顾:沪指冲高回落 两市成交金额仅剩7000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日冲高回落&#xff0c;午后一度集体翻绿&#xff0c;临近尾盘小幅回升。光伏产业链再度走强&#…

aws 在ecs外部实例上运行gpu负载

参考资料 https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/ecs-gpu.htmlhttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instanceshttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/install-nvidia-drive…

LeetCode 63.不同路径Ⅱ

思路&#xff1a; 在有障碍物的地方增加一个判断即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

K8s集群之 存储卷 PV PVC

目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储​​​​​​​ 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下&#xff1a;…

C++ vector 模拟实现

vector的底层也是一个动态数组&#xff0c;他与 string 的区别就是&#xff0c;string 是专门用来存储字符类数据的&#xff0c;为了兼容C语言&#xff0c;使用C语言的接口&#xff0c;在string的动态数组内都会都开一块空间用来存 \0 &#xff0c;而vector则不会。 首先我们要…

【Linux多线程】认识多线程创建线程

文章目录 什么是多线程为什么称linux下的线程是轻量级进程呢&#xff1f; 线程的优点线程的缺点线程异常线程和进程创建线程1.pthread_create2.pthread_self 什么是多线程 进程是正在运行的程序的实例&#xff0c;而线程&#xff08;thread&#xff09;是进程中的一个执行路线…

Springboot邮件发送配置

Springboot邮件发送配置 pom.xml依赖&#xff1a; <dependency><groupId>org.eclipse.angus</groupId><artifactId>jakarta.mail</artifactId><version>2.0.3</version> </dependency> <dependency><groupId>or…

跨域的解决方案

1. 计算机更改跨域 1.C盘->Windows->System32->drivers->etc 2.修改hosts 文件2. Chrome浏览器的跨域设置 操作步骤&#xff1a;1.打开我的电脑——C盘 新建一个文件夹&#xff0c;命名为MyChromeDevUserData2.右键——Chrome——快捷方式——目标&#xff0c;在…

ChatGPT成知名度最高生成式AI产品,使用频率却不高

5月29日&#xff0c;牛津大学、路透社新闻研究所联合发布了一份生成式AI&#xff08;AIGC&#xff09;调查报告。 在今年3月28日—4月30日对美国、英国、法国、日本、丹麦和阿根廷的大约12,217人进行了调查&#xff0c;深度调研他们对生成式AI产品的应用情况。 结果显示&…

ElementUI之el-table标题列中显示el-tooltip

ElementUI之el-table标题列中显示el-tooltip 文章目录 ElementUI之el-table标题列中显示el-tooltip1. el-table标题列中显示el-tooltip2. 实现代码3. 展示效果 1. el-table标题列中显示el-tooltip 在el-table-column标签内添加具名插槽v-slot:header 在el-tooltip标签中使用具…