Python 正则表达式模块使用

目录

1、匹配单个字符

2、匹配多个字符

3、匹配开头结尾

4、匹配分组

说明:在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用re模块

表达式:re.match(正则表达式, 要匹配的字符串) 有返回值说明匹配成功;否则匹配失败。

特别注意:正则表达式的前面必须添加 r 进行标记正则表达式;因为re中字符串需要是正则式,因此其本身不能被python当作特殊字符处理,故用r使得re接收到完整的正则式字符串。

 示列:

import reresult = re.match(r"hello", "hello world")
print(result)result1 = re.match(r"[hH]ello", "hello world")
print(result1)result2 = re.match(r"HHHello", "hello world")
print(result2)

1、匹配单个字符

以下匹配均只匹配单个字符

字符

功能

.

匹配任意1个字符(除了\n) re.match()添加re.S参数后可以匹配\n

[]

匹配[]中列举的字符

\d

匹配数字,即0~9

\D

匹配非数字,即不是数字

\s

匹配空白,即空格,tab键

\S

匹配非空白

\w

匹配单词字符,即a-z、A-Z、0-9、_

\W

匹配非单词字符

- :表示连续的内容 0-9 a-z A-Z

group() : 获取匹配成功后的内容

# 匹配单个字符
import reres1 = re.match(r"这是re模块\d", "这是re模块1")
print(res1.group()) # 这是re模块1res2 = re.match(r"这是re模块\d", "这是re模块9")
print(res2.group()) # 这是re模块9res3 = re.match(r"这是re模块[1-367]", "这是re模块3")
print(res3.group()) # 这是re模块3res4 = re.match(r"这是re模块[1-367]", "这是re模块7")
print(res4.group()) # 这是re模块7res5 = re.match(r"这是re模块[1-3a-cA-D]", "这是re模块D")
print(res5.group()) # 这是re模块Dres6 = re.match(r"这是re模块\s", "这是re模块 D")
print(res6.group()) # 这是re模块res7 = re.match(r"这是re模块\w", "这是re模块_")
print(res7.group()) # 这是re模块_

2、匹配多个字符

字符

功能

*

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

+

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

匹配前一个字符出现1次或者0次,即要么有1次,要么没有(非贪婪匹配)

{m}

匹配前一个字符出现m次

{m,n}

匹配前一个字符出现从m~n次

示例:

import re# 匹配多个字符
# {m,n} 匹配前一个字符出现从m~n次
res1 = re.match(r"这是re模块\d{1,3}", "这是re模块1")
print(res1.group()) # 这是re模块1res2 = re.match(r"这是re模块\d{1,3}", "这是re模块123")
print(res2.group()) # 这是re模块123# {m} 匹配前一个字符出现m次
# \d{11} 数字必须连续出现11次
res1 = re.match(r"\d{11}", "12345678901")
print(res1.group()) # 12345678901res2 = re.match(r"\d{11}", "12345A678901")
print(res2.group()) # AttributeError: 'NoneType' object has no attribute 'group'# ?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
# 判断电话取号是否合法
res1 = re.match(r"021-\d{8}", "021-12345678")
print(res1.group()) # 021-12345678res2 = re.match(r"021-?\d{8}", "02112345678")
print(res2.group()) # 02112345678res3 = re.match(r"021-?\d{8}", "021-12345678")
print(res3.group()) # 021-12345678res4 = re.match(r"\d{3,4}-?\d{8}", "0210-12345678")
print(res4.group()) # 0210-12345678# * 匹配前一个字符出现0次或者无限次,即可有可无
# . 匹配任意1个字符(除了\n)
# 如果一个字符串内容很长并且有很多换行 使用三引号"""或'''
txt_content = '''adshgad
564898
sachoiaus
sachsayogca
asjyha
sajp78adas
958dnouahd8
++0
.
'''
res1 = re.match(r".*", txt_content)
print(res1.group()) # adshgad \n(换行)无法匹配res2 = re.match(r".*", txt_content, re.S)
print(res2.group()) #添加re.S参数后 匹配html_content里面的所有内容# + 匹配前一个字符出现1次或者无限次,即至少1次
# . 匹配任意1个字符(除了\n)
res1 = re.match(r".+", "025sdcha")
print(res1.group()) # 025sdchares2 = re.match(r".+", "")
print(res2.group()) # AttributeError: 'NoneType' object has no attribute 'group'

3、匹配开头结尾

字符

功能

^

匹配开头字符串

$

匹配字符串结尾

示例1:匹配出,变量名是否有效

import redef main():names = ["name1", '_name', '02nmae', '__name__', 'name!', 'name@#']for name in names:res = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*", name)if res:print("有效的变量名有: {}; 通过正则表达式匹配出来的数据是: {}".format(name, res.group()))else:print("无效的变量名有: ", name)if __name__ == '__main__':main()

问题:可以看出变量:name!、name@#是不合法的但是match()函数还是有返回值,原因是match()函数自带从开头开始匹配但是不判断结尾。要想match()函数判断结尾需要使用字符:$

示例1:优化

  • 注意:此例的判断开头符 ^ 可以省略
import redef main():names = ["name1", '_name', '02nmae', '__name__', 'name!', 'name@#']for name in names:res = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)if res:print("有效的变量名有: {}; 通过正则表达式匹配出来的数据是: {}".format(name, res.group()))else:print("无效的变量名有: ", name)if __name__ == '__main__':main()

字符转义问题

  • 1、如果在正则表达式中需要用到某些普通的字符,比如 . ? 等只需要在该字符的前面添加一个反斜杠\进行转义

  • 2、使用了[]符代表只匹配一个字符

示例如下:匹配出qq的邮箱地址,且@符号之前有4到20位,例如:123@qq.com

import redef main():addrs = ["01552ahsgfhuag@qq.com", "5502@qq.com", "dss15@qq.com", "15sajhaj", "15613@qq.cn"]for addr in addrs:# 如果在正则表达式中需要用到某些普通的字符,比如 . ? 等只需要在该字符的前面添加一个反斜杠\进行转义,# 即出现需要匹配的字符和正则表达式的字符重合了,那么使用反斜杠\对需要匹配的字符进行转义。res = re.match(r"^[0-9a-zA-Z]{4,20}@qq\.com$", addr)if res:print("合法的邮箱有: ", addr)else:print("不合法的邮箱有: ", addr)if __name__ == '__main__':main()

4、匹配分组

字符

功能

|

匹配左右任意一个表达式

(ab)

将括号中的字符作为一个分组

\num

引用分组num匹配到的字符串

(?P)

分组起别名(注意要加上括号)

(?P=name)

引用别名为name分组匹配到的字符串

示列:

import reres1 = re.match(r"[a-zA-Z0-9_]{4,20}@qq\.com", "hello@qq.com").group()
print(res1) # hello@qq.com# | 匹配左右任意一个表达式
res2 = re.match(r"[a-zA-Z0-9_]{4,20}|@qq\.com", "@qq.com").group()
print(res2) # @qq.com# (ab) 将括号中的字符作为一个分组
res3 = re.match(r"[a-zA-Z0-9_]{4,20}@(sohu|qq)\.com", "hello@qq.com").group()
print(res3) # hello@qq.com# 取得匹配成功之后分组里面的数据 在group里面取得
res4 = re.match(r"[a-zA-Z0-9_]{4,20}@(sohu|qq)\.com", "hello@qq.com").group(1)
print(res4) # qqres5 = re.match(r"([a-zA-Z0-9_]{4,20})@(sohu|qq)\.com", "hello@qq.com").group(1)
print(res5) # hello  当group(2)时取得结果为:qq#  \num引用分组num匹配到的字符串 要求匹配标签是否为1组即<h1></h1>为1组
html_str = "<h1>hello world</h1>"
res6 = re.match(r"<\w*>.*</\w*>", html_str).group()
print(res6) # <h1>hello world</h1>html_str2 = "<h1>hello world</h2>"
res6 = re.match(r"<\w*>.*</\w*>", html_str2).group()
print(res6) # <h1>hello world</h2> 此处本不应该匹配成功的,但是还是匹配成功了所以需要修改为第一个标签和最后一个标签要一样# 修改如下:
res7 = re.match(r"<(\w*)>.*</\1>", html_str2).group()
print(res7) # AttributeError: 'NoneType' object has no attribute 'group'res8 = re.match(r"<(\w*)>.*</\1>", html_str).group()
print(res8) # <h1>hello world</h1>html_str3 = "<body><h1>hello world</h1></body>"
res9 = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_str3).group()
print(res9) # <body><h1>hello world</h1></body># (?P<name>)分组起别名 (?P=name)引用别名为name分组匹配到的字符串
res10 = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str3).group()
print(res10) # <body><h1>hello world</h1></body>

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

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

相关文章

13-pyspark的共享变量用法总结

目录 前言广播变量广播变量的作用 广播变量的使用方式 累加器累加器的作用累加器的优缺点累加器的使用方式 PySpark实战笔记系列第四篇 10-用PySpark建立第一个Spark RDD(PySpark实战笔记系列第一篇)11-pyspark的RDD的变换与动作算子总结(PySpark实战笔记系列第二篇))12-pysp…

Springboot+Vue项目-基于Java+MySQL的课程作业管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

秀米、135、蚂蚁编辑器如何为推文添加附件

秀米、135、蚂蚁编辑器作为第三方的公众号图文排版工具&#xff0c;给从事运营和编辑工作的同学提供了更多的排版选择。不同于公众号自家的编辑器&#xff0c;这些第三方编辑器脱离了微信的直接支持&#xff0c;在很多排版操作上&#xff0c;还是有很多操作不一样的地方。 公众…

通过 Vue 3 组合式 API 优化 Uni-app 基础页面功能

Uni-app 是一个跨平台的应用开发框架&#xff0c;支持同时开发小程序、App 和 H5 等多个平台。而 Vue 3 的组合式 API 则是 Vue 3 新增的特性之一&#xff0c;它可以让我们更好地组织和复用组件逻辑。本文将结合 Vue 3 的组合式 API&#xff0c;来优化 Uni-app 中基础页面的功能…

自动化运维(二十三)Ansible 实战动态库存插件和回调插件

Ansible 支持多种类型的插件&#xff0c;这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习动态库存插件和回调插件。 一、动态库存插件 Ansible 动态库存插件允许从各种外部数据源动态获取库存信息&#xff0c;包括主…

AndroidAutomotive模块介绍(一)整体介绍

前言 Android Automotive 是一个基本 Android 平台&#xff0c;可运行 IVI 系统中预安装的 Android 应用以及可选的第二方和第三方 Android 应用。 本系列文档将会系统的介绍 Android Automotive 的功能、架构、逻辑等。模块逻辑将从 应用api接口、系统服务、底层服务&#x…

软件设计师:11-结构化开发与UML

结构化开发&#xff08;3-4分&#xff09; 一、模块化 二、耦合&#xff08;背&#xff09; 三、内聚&#xff08;背&#xff09; 四、设计原则&#xff08;背&#xff09; 五、系统文档 六、数据流图 数据流的起点或终点必须有一个是加工 判断依据&#xff1a; 1、…

Vivado Design Suite中route_design命令脚本示例

本文详细介绍了四个route_design命令的示例脚本&#xff0c;这些脚本需要添加到工程的约束文件.xdc中&#xff0c;结果保存在工程文件中的runs\impl_1中的runme.log文件。 一、示例脚本1 route_design write_checkpoint -force $outputDir/post_route report_timing_summary …

img使用 :src 动态绑定图片地址,图片不成功

使用vue cli 创建的vue2项目&#xff0c;项目中想实现轮播效果。 出现的问题&#xff1a; 使用 :src 动态绑定图片地址&#xff0c;图片没有出现 <el-carousel :interval"3000" arrow"always"><el-carousel-item v-for"(item,index) in sw…

【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种频域上的多载波调制技术&#xff0c;经常用于高速数据通信中。以下是关于多径数目、有无CP&#xff08;循环前缀&#xff09;以及有无信道均衡在OFDM系统中对误码率的影响&am…

6-125 二叉树的后序遍历(Python语言描述)

本题要求输出二叉树的后序遍历,输出格式见样例。 函数接口定义: #后序遍历 def postOrder(T)其中二叉树类的定义如下: #二叉树的存储-二叉链表 class BinaryTree:#1.构造方法def __init__(self,newValue):self.key = newValue #树根self.left = None #左子树初…

小程序如何通过把动态数据值传入到css文件中控制样式

场景&#xff1a;动态改变一个模块的高度 一、常用解决方法&#xff1a;行内样式绑值&#xff0c;或者动态class来传递 <viewclass"box":style"height: ${boxHeight}px">我是一个动态高度的box,我的高度是{{boxHeight}}px </view>二、高度传…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 &#xff08;1&#xff09;网络协议&#xff1a;计算机网络和分布系统中…

循序渐进丨MogDB 数据库带级联从库的集群切换后如何保持原有架构?

生产数据库运行过程中可能会涉及到升级或者打补丁&#xff0c;导致各节点的角色有计划的发生改变。如果集群内角色发生改变&#xff0c;是否还能保持原有架构继续对外提供服务呢&#xff1f;我们来做一下测试。 采用22模式模拟同城两机房部署4节点 MogDB 数据库集群&#xff0c…

K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)

介绍 容器中的文件在磁盘上是临时存放的&#xff0c;当容器崩溃或停止时容器上面的数据未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间&#xff0c;kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时…

gitlab、jenkins安装及使用文档二

安装 jenkins IP地址操作系统服务版本192.168.75.137Rocky9.2jenkins 2.450-1.1 jdk 11.0.22 git 2.39.3192.168.75.138Rocky9.2gitlab-ce 16.10.0 结合上文 jenkins安装 前期准备&#xff1a; yum install -y epel-release yum -y install net-tools vim lrzsz wget…

WSL访问adb usb device

1.Windows上用PowerShell运行&#xff1a; winget install --interactive --exact dorssel.usbipd-win 2.在WSLUbuntu上终端运行&#xff1a; sudo apt install linux-tools-generic hwdata sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-too…

Gitea是一个开源、轻量级的自托管Git解决方案

Gitea介绍 Gitea是一个由Go语言编写的、轻量级的、自托管的Git解决方案&#xff0c;类似于GitHub、GitLab等平台。它是用Go语言编写的开源软件&#xff0c;提供了Git版本控制系统的基本功能&#xff0c;包括代码托管、问题跟踪、代码审查、Wiki等。Gitea的设计目标是简单易用、…

Swift中的枚举

在Swift中&#xff0c;枚举&#xff08;Enumeration&#xff09;是一种定义一组相关值的方式。枚举可以包含零个或多个成员&#xff0c;每个成员可以有关联的值。枚举可以用于定义一组相关的选项、状态或错误类型。 以下是Swift中定义枚举的示例&#xff1a; //定义一个简单的…

酷开科技OTT大屏营销:开启新时代的营销革命

随着互联网技术的不断发展和普及&#xff0c;大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下&#xff0c;酷开科技凭借其强大的技术实力和敏锐的市场洞察力&#xff0c;成功地将大屏转化为一种新的营销渠道&#xff0c;为品牌和企业带来了前所未有的商业机会。 酷开科技…