Python 正则表达式模块使用

目录

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.mfbz.cn/a/548655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3项目 使用 element-plus 中 el-collapse 折叠面板

最近接触拉了一个项目&#xff0c;使用到 element-plus 中 el-collapse 折叠面板&#xff0c;发现在使用中利用高官网多多少少的会出现问题。 &#xff08;1.直接默认一个展开值&#xff0c;发现时显时不显 2 . 数据渲染问题&#xff0c;接口请求了&#xff0c;页面数据不更新 …

通过Omnet++官网tictoc教程学习在Omnet++中构建和运行仿真 Part3

TicToc Part3 增强2节点 TicToc增加图标增加 日志添加状态变量增加参数使用NED 继承模拟处理延时随机数字和参数超时、取消计时器重传同样的消息 官方文档 在官方文档中&#xff0c;你可以看见所有的代码 增强2节点 TicToc 增加图标 为了使模型在GUI中看起来更好看&#xff…

计算机网络—TCP协议详解:协议构成、深度解析(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

vs2008使用 openmp

目录 1 在项目中找到property pages>>c/c>>language>>openmp支持 2 在环境变量中增加“OMP_NUM_THREADS”变量&#xff0c;数值自己根据你的CPU的性能来设置&#xff0c;一般2、4、8等 3 在项目中输入如下代码&#xff0c;并编译运行 4 结果与不使用omp的…

浅谈Java IO流

Java中的IO流&#xff08;Input/Output streams&#xff09;是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念&#xff0c;允许Java程序与外部世界进行数据交换&#xff0c;无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照…

RAG 如何消除大模型幻觉

什么是大模型幻觉 假设我们有一个基于大型生成模型&#xff08;如GPT-3&#xff09;的问答系统&#xff0c;该系统用于回答药企内部知识库中的问题。我们向其提出一个问题&#xff1a;“阿司匹林的主要药理作用是什么&#xff1f;” 正确的答案应该是&#xff1a;“阿司匹林主…

Qt 的内存管理机制

目录 Qt 的内存管理机制 Qt 的对象树 利用代码查看自动释放 Qt 的内存管理机制 Qt 的对象树 Qt 中所有的控件都是被一颗多叉树管理起来的&#xff0c;这样就是为了方便释放资源的时候方便释放&#xff0c;而我们在编写代码的时候&#xff0c;创建对应的控件&#xff0c;然…

Samtec科普 | 一文入门连接器电镀的QA

【摘要/前言】 像大多数电子元件一样&#xff0c;无数子元件和工艺的质量直接影响到成品的质量和性能。对于PCB级连接器&#xff0c;这些因素包括针脚材料、塑料类型、模制塑料体的质量、尾部的共面性、表面处理&#xff08;电镀&#xff09;的质量、选择正确的连接器电镀、制…

【C++算法模板】数论:欧拉筛,线性查找质数的算法

文章目录 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09;2&#xff09;欧拉筛 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09; bool isPrime(int num) {for(int i2;i<sqrt(num)) {if(num%i0)return false;}return true; }如果要…

跑马拉松跑成骨坏死?!马拉松赛事密集,提前了解运动损伤很重要

跑步狂热者右脚疼痛未重视 日积月累右脚终于“撑”不住了 近日&#xff0c;徐大爷来院就诊说自己半年前右脚莫名出现酸痛&#xff0c;一直没当回事&#xff0c;结果1个月前跑完步疼痛加重&#xff0c;最近严重到影响日常走路&#xff0c;无奈只能找医生。在医生的详细检查和认真…

基于arduino的ESP32上蓝牙midi音乐设备开发教程

目录 简介 开发环境 开发过程 函数介绍 相关文章 简介 首先看几个视频&#xff0c;大佬们做的东西&#xff0c;都是基于esp32。 自制卡林巴电子琴&#xff0c;可通过蓝牙连接手机库乐队 MIDI Boy【理科生的第一件乐器】_哔哩哔哩_bilibili 【Totoro】模仿“埙”的电子吹…

win11电脑驱动怎么更新,windows11更新驱动

驱动是指计算机里软件的程序,硬件的运作离不开驱动的支持,因为驱动就是使得硬件和电脑系统沟通的桥梁。既然驱动如此重要,那么不装肯定不行,如果有问题,也要及时地修复和更新。最近,有位win11用户,想要了解win11电脑驱动怎么更新?接下来,教程会带来两种更新win11驱动的…

vscode i18n Ally插件配置项

.vscode文件&#xff1a; {"i18n-ally.localesPaths": ["src/lang"], //显示语言&#xff0c; 这里也可以设置显示英文为en,// 如下须要手动配置"i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested&#xff1a…

[C++初阶]类和对象(一)

1.面向过程和面向对象的区分 我们之前都是用C语言写的代码,我们知道C语言是一个面向过程的语言,但是现在我们学的时C,我们都知道C是一种面向对象的语言,那么什么叫面向过程?什么叫面向对象呢? 这里我们来举个例子: 比如我们是开饭店的&#xff0c;客人点了一道菜&#xff0c…

开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过langchain框…

什么是T型槽铸铁平板中内应力——河北北重厂家

T型槽铸铁平板中的内应力指的是平板内部受到的内部力&#xff0c;包括拉应力和剪应力。在T型槽铸铁平板使用过程中&#xff0c;由于自身重量、外力加载等原因&#xff0c;会产生内部应力。这些内应力是平板内部各部分之间的相互作用力&#xff0c;使得平板各部分受到不同的拉伸…

C++ 为什么不能在构造函数中调用虚函数

最近在Clion编辑器中看到构造函数中调用虚函数提示&#xff1a; Do not invoke virtual member functions from constructor 这里记录一下为什么不能在构造函数中调用虚函数。 #include <iostream> #include <string>using namespace std;class BaseClass {publi…

大模型时代:普通人该如何获利?

随着科技的飞速发展&#xff0c;我们正处在一个大模型的时代。所谓大模型&#xff0c;就是指那些拥有数十亿、甚至千亿参数的深度学习模型。这些大模型的出现&#xff0c;不仅推动了人工智能技术的进步&#xff0c;也为普通人创造了众多的获利机会。那么&#xff0c;在这个大模…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

GAMS104 现代游戏引擎 2

渲染的难点可以分为一下三部分&#xff1a;如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影&#xff0c;或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多&#xff0c;在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…
最新文章