正则表达式

简介: 正则表达式

正则表达式

正则表达式在线工具

点—匹配所有字符

.表示要匹配除了换行符以外的任何单个字符

import re
content = """苹果是绿色的
    橙子是橙色的
    香蕉是黄色的
    乌鸦是黑色的"""

p = re.compile(r".色")

if __name__=='__main__':
    for line in p.findall(content):
        print(line)

星号-重复匹配任意次

*星号表示匹配前面的子表达式任意次,包括0次

import re
content = """苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""
if __name__=="__main__":
    p = re.compile(r",.*")
    for line in p.findall(content):
        print(line)

加号-重复匹配多次

+表示匹配前面的子表达式一次或多次,不包括0次

import re
content = """苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的
猴子,
"""
if __name__=="__main__":
    p = re.compile(r",.+")
    for line in p.findall(content):
        print(line)

花括号-匹配指定次数

表达式油{3,4}表示匹配 连续的 油 字 至少3次,至多4次

import re
content = """红彤彤,绿油油,黑乎乎,绿油油油油"""

p = re.compile(r"油{2,3}") #也可以"油{4}"这样使用

if __name__=='__main__':
    for line in p.findall(content):
        print(line)

问号-表示非贪婪模式

*+,等默认为贪婪模式,加上问号后表示为非贪婪模式

import re
content = "<html><head><title>Title></title>"
p1 = re.compile(r"<.*>")

p2 = re.compile(r"<.*?>")

if __name__=="__main__":
    print("---------贪婪模式----------")
    for line in p1.findall(content):
        print(line)
    print("---------非贪婪模式----------")
    for line in p2.findall(content):
        print(line)

反斜杠的多种用途

\转义包含元字符的内容 ****

import re
content = """
苹果.是绿色的
橙子.是橙色的
香蕉.是黄色的
乌鸦.是黑色的"""
p1 = re.compile(r".*\.") #对.进行转义
if __name__=="__main__":
    for line in p1.findall(content):
        print(line)

\d 匹配0-9之间任意一个数字,等价于表达式[0-9]


\D匹配任意不是0-9之间的数字字符,等价于表达式[^0-9]


\s匹配任意一个空白字符,包括空格,tab,换行符等,等价于表达式[\t\n\r\f\v]


\S匹配任意一个非空白字符[^\t\n\r\f\v]


\w匹配任意一个文字字符,包括字母,数字,下划线,等价于表达式[a-zA-Z0-9_]


\W匹配任意一个非文字字符,等价于表达式[^a-zA-Z0-9_]

方括号-匹配某几种类型

方括号表示要匹配某几种类型的字符。

[abc]可以匹配a,b,c里面任意一个字符,等价于[a-c]

[a-c]中间的-表示一个范围a-c。

[]中字符失去原来的含义,不需要转义

import re
content = """
张三 15472955246 21
李四 12978952246 23
王五 13378952246 22
赵六 16978955246 23
小七 15078955246 22
"""
p1 = re.compile(r"1[3-5]\d{9}")

if __name__=="__main__":
    for line in p1.findall(content):
        print(line)

起始,结尾位置和单行多行模式

起始行和单行,多行模式

^表示匹配文本起始行位置

正则表达式可以设定单行模式和多行模式

单行模式匹配整个文本的开头位置

多行模式匹配文本每行的开头位置

import re
content = """001-苹果价格-60
002-橙子价格-70
003-香蕉价格-40
"""
p1 = re.compile(r"^\d+")#默认为单行模式

p2 = re.compile(r"^\d+",re.M)#多行模式

if __name__=="__main__":
    print("--------单行模式--------")
    for line in p1.findall(content):
        print(line)
    print("--------多行模式--------")
    for line in p2.findall(content):
        print(line)

$表示文本的结束位置

单行模式匹配整个文本的结尾位置

多行模式匹配文本每行的结尾位置

import re
content = """001-苹果价格-60
002-橙子价格-70
003-香蕉价格-40
"""
p1 = re.compile(r"\d+$")#默认为单行模式

p2 = re.compile(r"\d+$",re.M)#多行模式

if __name__=="__main__":
    print("--------单行模式--------")
    for line in p1.findall(content):
        print(line)
    print("--------多行模式--------")
    for line in p2.findall(content):
        print(line)

括号-组选择

括号称之为正则表达式的组选择,是从正则表达式匹配内容里面扣取出其中的某部分

import re
content = """张三 15472955246 21
李四 12978952246 23
王五 13378952246 22
赵六 16978955246 23
小七 15078955246 22"""
p = re.compile(r'^(.+).*(\d{11}).*',re.M)#多个括号取值结果为元组格式
if __name__=="__main__":
    for line in p.findall(content):
        print(line)

使用正则表达式切割字符串

字符串对象的split()方法只适应于非常简单的字符串切割。而正则下的split更加灵活。

import re
names = "关羽; 张飞, 赵云,马超, 黄忠 李逵"
p = re.split(r'[;,\s]+',names)
print(p)

sub替换-参数为回调函数
import re

content = """
下面是这学期要学习的课程:

<a href='https://www.bilibili.com/video/av66771949/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律

<a href='https://www.bilibili.com/video/av46349552/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式

<a href='https://www.bilibili.com/video/av90571967/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
"""

#替换函数,参数是match对象
def sunFunc(match):
    #Match对象的group(0)返回的是整个匹配上的字符串
    src = match.group(0)
    #Match对象的group(1)匹配的是第一个分组的内容
    number = int(match.group(1))+6
    dest = f'/av{number}'
    print(f'{src} 替换为 {dest}')
    #返回最终的值
    return dest
if __name__=="__main__":
    new = re.sub(r'/av(\d+?)/',sunFunc,content)
    print(new)

相关文章
解决方案:Missing URI template variable ‘userName‘ for method parameter of type String
解决方案:Missing URI template variable ‘userName‘ for method parameter of type String
|
Java 数据库
POJO、PO、DTO、DAO、BO、VO需要搞清楚的概念
POJO 全称为:Plain Ordinary Java Object,即简单普通的java对象。一般用在数据层映射到数据库表的类,类的属性与表字段一一对应。 PO 全称为:Persistant Object,即持久化对象。
34046 1
|
6月前
|
存储 编解码 JSON
鸿蒙应用开发从入门到实战(十):ArkUI图片组件Image
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Image图片组件的使用。
380 1
|
Rust 安全 Go
揭秘Rust语言:为何它能让你在编程江湖中,既安全驰骋又高效超车,颠覆你的编程世界观!
【8月更文挑战第31天】Rust 是一门新兴的系统级编程语言,以其卓越的安全性、高性能和强大的并发能力著称。它通过独特的所有权和借用检查机制解决了内存安全问题,使开发者既能享受 C/C++ 的性能,又能避免常见的内存错误。Rust 支持零成本抽象,确保高级抽象不牺牲性能,同时提供模块化和并发编程支持,适用于系统应用、嵌入式设备及网络服务等多种场景。从简单的 “Hello World” 程序到复杂的系统开发,Rust 正逐渐成为现代软件开发的热门选择。
458 1
|
人工智能 搜索推荐 API
AI尝鲜:使用dify监测金融市场情绪
本实验介绍了如何利用dify创建金融市场情绪工作流,通过输入公司名称(如英伟达),使用Tavily搜索引擎获取相关金融新闻,并借助大模型(如通义千问)进行情绪分析,输出介于-1到1之间的情绪评分。实验分为四步:安装dify、设置模型供应商、配置搜索引擎以及创建工作流。最终,用户可运行工作流,获得量化的市场情绪数据,为量化交易策略提供依据。
AI尝鲜:使用dify监测金融市场情绪
|
安全 Cloud Native Shell
云上攻防:云原生篇&Docker容器逃逸
本文介绍了Docker的基本概念及其对渗透测试的影响,重点讲解了容器逃逸的方法。Docker是一种轻量级的容器技术,与虚拟机相比,具有更高的便携性和资源利用率。然而,这也带来了安全风险,特别是容器逃逸问题。文章详细描述了三种常见的容器逃逸方法:不安全的配置、相关程序漏洞和内核漏洞,并提供了具体的检测和利用方法。此外,还介绍了几种特定的漏洞(如CVE-2019-5736和CVE-2020-15257)及其复现步骤,帮助读者更好地理解和应对这些安全威胁。
1156 3
云上攻防:云原生篇&Docker容器逃逸
|
数据采集 存储 机器学习/深度学习
探索Python的力量:如何处理大数据
探索Python的力量:如何处理大数据
250 7
|
存储 机器学习/深度学习 人工智能
矢量数据库与LLM的集成:实践指南
矢量数据库与LLM的集成:实践指南
548 2
|
计算机视觉 Python
使用Python进行多点拟合以确定标准球的球心坐标
使用Python进行多点拟合以确定标准球的球心坐标
527 1
|
存储 开发框架 缓存
基因组组装:NextDenovo2 使用大全
基因组组装:NextDenovo2 使用大全