Python 正则表达式模块使用

news2024/11/26 4:52:13

目录

1、匹配单个字符

2、匹配多个字符

3、匹配开头结尾

4、匹配分组

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

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

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

 示列:

import re

result = 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 re

res1 = re.match(r"这是re模块\d", "这是re模块1")
print(res1.group()) # 这是re模块1

res2 = re.match(r"这是re模块\d", "这是re模块9")
print(res2.group()) # 这是re模块9

res3 = re.match(r"这是re模块[1-367]", "这是re模块3")
print(res3.group()) # 这是re模块3

res4 = re.match(r"这是re模块[1-367]", "这是re模块7")
print(res4.group()) # 这是re模块7

res5 = re.match(r"这是re模块[1-3a-cA-D]", "这是re模块D")
print(res5.group()) # 这是re模块D

res6 = 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模块1

res2 = 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()) # 12345678901

res2 = 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-12345678

res2 = re.match(r"021-?\d{8}", "02112345678")
print(res2.group()) # 02112345678

res3 = re.match(r"021-?\d{8}", "021-12345678")
print(res3.group()) # 021-12345678

res4 = 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()) # 025sdcha

res2 = re.match(r".+", "")
print(res2.group()) # AttributeError: 'NoneType' object has no attribute 'group'

3、匹配开头结尾

字符

功能

^

匹配开头字符串

$

匹配字符串结尾

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

import re

def 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 re

def 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 re

def 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 re

res1 = 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) # qq

res5 = 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.coloradmin.cn/o/1591101.html

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

相关文章

服务器数据恢复—不同型号服务器RAID5数据恢复策略有何不同?

RAID5作为应用最广泛的raid阵列级别之一&#xff0c;在不同型号服务器中的RAID5出现故障后&#xff0c;处理方法也不同。 RAID5阵列级别是无独立校验磁盘的奇偶校验磁盘阵列&#xff0c;采用数据分块和独立存取技术&#xff0c;能在同一磁盘上并行处理多个访问请求&#xff0c;…

状态模式:管理对象状态转换的动态策略

在软件开发中&#xff0c;状态模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。这种模式把与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分散到对应的状态类中&#xff0c;使得状态和行为可以独立变化。本文将详细介绍状态…

【vue】defineProps 传数据 父传子

先行知识 【vue】导入组件 传值过程 App.vue <template><Header name"1234567890" url"https://www.1234567890.com" /><hr><!-- <Footer v-bind"propsWeb" /> --><Footer :"propsWeb" /><h…

elementui中el-select下拉列表偏移问题

问题截图 解决方法 在el-select中添加:popper-append-to-body"false"即可 加完后的效果

2024-4-12-实战:商城首页(下)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业小结 作业 .bg-backward {width: 60px; height: 60px;background: url(..…

uni-app的页面中使用uni-map-common的地址解析(地址转坐标)功能,一直报请求云函数出错

想在uni-app的页面中使用uni-map-common的地址解析&#xff08;地址转坐标&#xff09;功能&#xff0c;怎么一直报请求云函数出错。 不看控制台啊,弄错了控制台&#xff0c;就说怎么一直没有打印出消息。 所以开始换高德地图的&#xff0c;昨天申请了两个 一开始用的第二个web…

物理服务器与云服务器的租用对比

​ 物理服务器&#xff1a;每个基于 Web 的应用程序都依赖于一个服务器&#xff0c;该服务器提供网络中的数据存储&#xff0c;并可根据请求提供给客户端。例如&#xff0c;用户使用浏览器访问 Web 应用程序。服务器可确保托管客户端可以使用该硬件组件。与其他托管可能性相比&…

【SpringBoot整合系列】SpringBoot整合Shiro——权限控制

目录 安全框架?安全框架都有哪些&#xff1f; 什么是RBAC?ShiroShiro核心组件Shiro的运行机制 SpringBoot整合Shiro整合思路1.引入依赖2.项目结构及配置3.创建前端页面index.jsplogin.jsp 4.自定义Realm5.自定义配置类6.启动测试 认证和退出1.在index.jsp添加a标签2.Controll…

Java | Leetcode Java题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n 0) {return 0;}int fast 1, slow 1;while (fast < n) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow;}…

8路HDMI+8路AV高清视频流媒体编码器JR-3218HD

产品简介&#xff1a; JR-3218HD高清音视频编码产品支持8路高清HDMI音视频采集功能&#xff0c;8路AV视频采集功能&#xff0c;8路3.5MM独独立音频接口采集功能。编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质量可控制。支持HTTP/RTSP…

2024年蓝桥杯40天打卡总结

2024蓝桥杯40天打卡总结 真题题解其它预估考点重点复习考点时间复杂度前缀和二分的两个模板字符串相关 String和StringBuilderArrayList HashSet HashMap相关蓝桥杯Java常用算法大数类BigInteger的存储与运算日期相关考点及函数质数最小公倍数和最大公约数排序库的使用栈Math类…

服务器代理

服务器代理 配置&#xff1a;64G内存1 3090&#xff08;24g&#xff09;1P4000&#xff08;8g&#xff09; SSH连接 工作路径&#xff1a;/home/ubuntu/workspace/python Anaconda路径&#xff1a;/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…

设备树下的 LED 驱动实验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、修改设备树文件2创建设备树节点并获取属性 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发…

《师兄啊师兄》:玄机科技打造国漫新高峰,IP运营再显神力

在这个国漫蓬勃发展的时代&#xff0c;玄机科技再次以其超凡的制作水准和出色的IP运营能力&#xff0c;为我们带来了一部国漫新经典——《师兄啊师兄》。这部作品不仅在画面、剧情上达到了行业新高度&#xff0c;更在IP运营上展现出了其强大的实力与前瞻性。 《师兄啊师兄》的画…

easyui combobox下拉框组件输入检索全模糊查询

前引&#xff1a; easyui下拉组件&#xff08;combobox&#xff09;&#xff0c;输入检索下拉内容&#xff0c;是默认的右模糊匹配&#xff0c;而且不支持选择。因业务要求需要做成全模糊查询&#xff0c;目前网上搜索有两种方案&#xff1a; 1.修改easyui源码&#xff0c;这个…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

基于Whisper语音识别的实时视频字幕生成 (一): 流式显示视频帧和音频帧

Whishow Whistream&#xff08;微流&#xff09;是基于Whisper语音识别的的在线字幕生成工具&#xff0c;支持rtsp/rtmp/mp4等视频流在线语音识别 1. whishow介绍 whishow&#xff08;微秀&#xff09;是python实现的在线音视频流播放器&#xff0c;支持rtsp/rtmp/mp4等流式输…

设计模式——命令模式14

命令模式&#xff1a;用构造函数将 命令实现者 传递给 调用者。 例如下面 小贩进货 设计模式&#xff0c;一定要敲代码理解 命令抽象 /***文具* */ public interface Stationery {void make(); }命令实现类 public class Pencil implements Stationery{private Producer pr…

LLamaSharp加载llama.cpp转化好的模型

新建.net8控制台项目 安装依赖包 LLamaSharp和LLamaSharp.Backend.Cpu 准备好转化好的模型 没有的话参考这篇文章https://blog.csdn.net/qq_36437991/article/details/137248622 编写代码 using LLama; using LLama.Common; using LLama.Native;namespace llamasharpstu…

视频这么长,有必要浪费时间看吗?#知识社群N3

在这个信息爆炸的时代&#xff0c;我们每天都会被大量的二手信息包围。不论是社交媒体、新闻还是网络论坛&#xff0c;处处充斥着别人的观点和总结。但这些二手信息真的能够代替我们去源头获取内容吗&#xff1f;信息的片面性、观点的偏颇乃至于事实的曲解&#xff0c;不断地在…