匹配字符串

news2025/1/21 12:58:23

自学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.coloradmin.cn/o/1719304.html

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

相关文章

elementui中的el-checkbox-group添加全选按钮

//多选子组件 <template><div class"multiple-choice"><el-checkbox class"no1" v-if"isShowAllBtn" :indeterminate"isIndeterminate1" v-model"checkAll1" border :style"{borderColor:isIndetermina…

鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性

显隐控制 控制组件是否可见。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本…

微型导轨在自动化制造中有哪些优势?

微型导轨在自动化制造中发挥重要作用&#xff0c;能够满足自动化设备制造中对精度要求较高的工艺环节。适用于自动装配线、自动检测设备和机器人操作等环节&#xff0c;推动了行业的进步与发展。那么&#xff0c;微型导轨在使用中有哪些优势呢&#xff1f; 1、精度高和稳定性强…

基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享

LAMPLinux apache mysql( mariadb) PHP 结合利用华为云弹性负载均衡ELB弹性伸缩AS服务 优点&#xff1a; 将访问流量自动分发到多台云服务器&#xff0c;扩展应用系统对外的服务能力&#xff0c;实现更高水平的应用容错&#xff1b; 根据不同的业务、访问需求和预设策略&…

函数的创建和调用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函数&#xff0c;大家会想到数学函数吧&#xff0c;函数是数学最重要的一个模块&#xff0c;贯穿整个数学学习过程。在Python中&#xff0c;函数…

编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)

首先我们要清楚扫雷大概是如何实现的&#xff1a; 1.布置雷 2.扫雷&#xff08;排查雷&#xff09; &#xff08;1&#xff09;如果这个位置是雷就炸了&#xff0c;游戏结束 &#xff08;2&#xff09;如果不是雷&#xff0c;就告诉周围有几个雷 3.把所有不是雷的位置都找…

Leetcode:Z 字形变换

题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;二维矩阵的直接读写&#xff09; 解决办法&#xff1a;直接依据题目要求新建并填写一个二维数组&#xff0c;最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…

开源硬件初识——Orange Pi AIpro(8T)

开源硬件初识——Orange Pi AIpro&#xff08;8T&#xff09; 大抵是因为缘&#xff0c;妙不可言地就有了这么一块儿新一代AI开发板&#xff0c;乐于接触新鲜玩意儿的小火苗噌一下就燃了起来。 还没等拿到硬件&#xff0c;就已经开始在Orange Pi AIpro 官网上查阅起资料&…

PAT-1004 成绩排名(java实现)

这一关感觉还没第三关难&#xff0c;思路很清晰 题目 1004 成绩排名 读入 n&#xff08;>0&#xff09;名学生的姓名、学号、成绩&#xff0c;分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;格式为 第 1 行…

KT6368A双模蓝牙芯片上电到正常发送AT指令或指令复位需要多久

一、简介 KT6368A芯片上电到正常发送AT指令&#xff0c;或者开启蓝牙广播被搜索到&#xff0c;或者指令复位需要多久等等系列问题总结 详细描述 其实这些问题归结到一起&#xff0c;就还是一个问题&#xff0c;芯片上电需要多久的时间 在另外一份文档里面&#xff0c;是有描…

副业赚钱的路子有哪些?推荐15个靠谱副业和赚钱软件给你做

在这个工资永远追不上物价的时代&#xff0c;你是否也感到焦虑&#xff1f;是否想过在工作之余&#xff0c;开辟一条赚钱的副业之路&#xff1f;别急&#xff0c;今天就为你揭开副业赚钱的神秘面纱&#xff0c;带你一探究竟&#xff01; 一、宅富社任务&#xff1a;每日小任务&…

电缆线生产中 JG01Z-DG 系列单轴测径仪的重要作用

电缆线在工业配电领域有着广泛的应用&#xff0c;尤其适合要求较为严格的柔性安装场所&#xff0c;如电控柜&#xff0c;配电箱及各种低压电气设备&#xff0c;可用于电力&#xff0c;电气控制信号及开关信号的传输。 JG01Z-DG系列单轴测径仪是为线缆外径检测而制作的检测设备。…

2.4 Docker部署JDK

2.4 Docker部署JDK jdk17部署&#xff08;自定义镜像&#xff09; 1.在官网上下载jdk-17_linux-x64_bin.tar.gz&#xff0c;并安装到/usr/local目录下 cd /usr/local2.创建Dockerfile vim Dockerfile# 基于官方的Ubuntu 20.04镜像作为基础镜像 FROM ubuntu:20.04# 设置环境…

整数乘除法练习题

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #include<Windows.h>void show1(); .//开始界面 int getchoice(); //选择界面 int dowork(int n); //随机做乘除法 int num(); //用户确定做题的数量 v…

【深度密码】神经网络算法在机器学习中的前沿探索

目录 &#x1f69d;前言 &#x1f68d;什么是机器学习 1. 基本概念 2. 类型 3. 关键算法 4. 应用领域 5. 工作流程 &#x1f68b;什么是神经网络 基本结构 &#x1f682;神经网络的工作原理 前向传播&#xff08;Forward Propagation&#xff09;&#xff1a; 损失函…

数据分析案例-在线食品订单数据可视化分析与建模分类

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一键安装 HaloDB 之 Ansible for Halo

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽&#xff0c;国产数据库&#xff01;Halo DB! 三步走&#xff0c;Halo DB 安装指引 以及 HaloDB 的 Oracle 和 MySQL 兼容模式: …

构建企业级AI私有知识库

一、引言 在当今竞争激烈的市场环境中&#xff0c;企业为了保持竞争优势&#xff0c;需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库&#xff0c;不仅可以集中存储和管理企业知识&#xff0c;还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…

pytorch学习day3

一、模型创建&#xff08;Module&#xff09; 网络创建流程 ​ 上面的图表展示了使用PyTorch创建神经网络模型的主要步骤。每个步骤按顺序连接&#xff0c;展示了从导入必要的库到最终测试模型的整个流程&#xff1a; 导入必要的库&#xff1a;首先导入PyTorch及其相关模块。定…

六一见!|Post Microsoft Build and AI Day 上海开发者日

编辑/排版&#xff1a;Alan Wang 大小朋友明天见&#xff01; 6月1日&#xff0c;Microsoft Azure & Microsoft Reactor 面向大小朋友特别推出六一特辑&#xff0c;「Post Microsoft Build and AI Day 上海开发者日」 探讨 Microsoft Build 2024 带来的最新发布&#xff0…