正则表达式入门

正则表达式是什么

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式使用单个字符串pattern来描述、匹配一系列符合某个句法规则的字符串string。

七个例子

举例一 写什么就匹配什么
text = '2022114292,你是:Nxb, 体重:168, 学号:2022114292, 密码:131456,生日:1999-03-02, 座机号码是+86-15893860196'

 print(re.findall(r'131456',text))
 #['131456']

r:表示raw-原始字符,告诉编译器后面文本中的反斜杠不用转义。
re.findall(pattern,text,flags) 模式 字符串,附加条件。返回匹配列表。

举例二 找出特定的数字、字母。

    print(re.findall(r'\d',text))
    #['2', '0', '2', '2', '1', '1', '4', '2', '9', '2', '1', '1', '6', '8', '2', '0', '2', '2', '1', '1', '4', '2', '9', '2', '1', '3', '1', '4', '5', '6', '1', '9', '9', '9', '0', '3', '0', '2', '8', '6', '1', '5', '8', '9', '3', '8', '6', '0', '1', '9', '6']
	
    print(re.findall(r'[a-z]', text))
    #['x', 'b']

一些元字符
字符类别
a,b,c,d,1,2,3 字符常量写什么是什么
\d 单个的数字。\D 除了数字以外的任何字符。
\w 任意字母或数字下划线 。\W 除了任意字母或数字下划线
\s 一个空格。\S 一个非空格
[abcd] abcd中任意一个字符
[a-g] 范围:a~g的小写字母
[^a-g] 取反:除了a~g以外的任意字符
[\b] 退格符号
. 统配符,除了换行符\n之外任何一个字符

重复次数-量词
* 0或多个
+ 1或多个
? 0或1个
{2} 2个
{2,5} 2到5个
{2,} 至少2个
{,5} 最多5个

    .* 贪婪匹配 尽可能多。aabab #aabab
    .*? 懒惰匹配 尽可能少 aabab #aab
    text = 'aabab'
    print(re.findall(r'a.*?b',text))
    print(re.findall(r'a.*b', text))
    #['aab', 'ab']
	#['aabab']

举例三 找出连续的数字

    print(re.findall(r'\d+',text))
    #['2022114292', '168', '2022114292', '131456', '1999', '03', '02', '86', '15893860196']
    print(re.findall(r'\d{3}', text)) 
    #['202', '211', '429', '168', '202', '211', '429', '131', '456', '199', '158', '938', '601']

\d+中的’+‘修饰’\d’,表示1~n个数字。
\d{3} 表示连续3个数字为匹配模式
\d{3,4} 3个或4个连续数字为模式

举例四 找出文本中的座机号码
text = '手机号:18430792543,你是:Nxb, 体重:168, 学号:2022114292, 密码:131456,生日:1999-03-02, 座机号码是010-86551122'

	print(re.findall(r'\d{2,3}-\d{8}', text))
	#['010-86551122']

举例五 找出文本中的手机号或者座机号码

	print(re.findall(r'\d{9}|\+\d{2,3}-\d{8}',text))
	#['184307925', '202211429', '010-86551122']

用’|‘表示或,从左往右先匹配’|'前面的模式,不满足再匹配后面的模式
匹配模式中不能有空格

举例六 限定了位置 要求出现在句子开头的学号或手机号码
text = '18430792543,你是:Nxb, 体重:168, 学号:2022114292, 密码:131456,生日:1999-03-02, 座机号码是010-86551122'

	print(re.findall(r'^\d{9}|\d{2,3}-\d{8}$',text))
	#['184307925', '010-86551122']

位置匹配
^ 匹配一个行首或字符串的开头的位置
$ 匹配一个行末或字符串结束的位置
\b 匹配一个单词的边界 \B 匹配一个非单词边界

举例七
分组
组合模式 两种或以上的简单模式组合在一起,拼接、二选一
\d{6}[a-g]{6} 连续6个数字后面跟6个连续的a~g的字母
() 分为一组作为单独的量词
(abc){3} 表示 abcabcabc

text1 = 'barbar,dardar,bardar''

	print(re.findall(r'(\w{3})(\1)',text1))
	#[('bar', 'bar'), ('dar', 'dar')]

\w{3}表示任意三个连续字符,\1表示后续的三个连续字符和第一个()分组内的(\w{3})所得的字符串一样

python的正则表达式引擎——re的用法

re有八个方法

一、查找
re.search() 只返回一个Match对象
re.match() 只返回一个Match对象,从头个字符开始匹配
re.finditer() 返回Match迭代器
以上三个匹配不到时,返回None

re.findall() 返回字符串列表

看例子
text2 = '电话簿,张三:0866 15893860196,李四:086 19147838506'

	m = re.search(r'(\d{3,4}) (\d{11})', text2)
	print(m)
	#<re.Match object; span=(7, 23), match='0866 15893860196'>
	
	print(m.group)
	#0866 15893860196
	
	print(m.group(2))
	#15893860196
python中的match对象是一次匹配的结果,其包含了很多匹配的相关信息<...>
match对象只包含的是一次匹配的结果,只返回第一次匹配的结果.

match对象涉及的相关方法

.group() : 获得匹配后的字符串。如果已经分组,.group(1)返回第1个分组,.group(2)返回第2个,.group()返回所有分组

.start() : 匹配字符串在给定字符串的开始位置下标

.end() : 匹配字符串在给定字符串的结束位置下标

.span() : 返回一个元组类型,包含开始位置下标和结束位置下标

如果需要得到每一次返回的match对象,可以由finditer()方法进行迭代来获取。
text2 = '电话簿,张三:0866 15893860196,李四:086 19147838506'

    m = re.finditer(r'\d{3,4} \d{11}', text2)
    print(m)
    #<callable_iterator object at 0x00000183B0835910>
    for i in m:
        print(i.group())
    #0376 15893860196
	#086 19147838506

flags

flags = re.I 
忽略字母大小写 ignore case

flags = re.M
multi line 多行
使用本标志后,‘^’和‘$’匹配行首和行尾时,会增加换行符之前和之后的位置。

flags = re.S
dot matches all
使 “.” 特殊字符完全匹配任何字符,包括换行\n 

text2 = 'abc,Abc,ABC'

	print(re.findall(r'abc',text2,flags=re.I))
	#['abc', 'Abc', 'ABC']
二、替换
re.sub(pattern, repl, string, count, flags) 
在string里将pattern替换成repl,count表示是要替换的最大次数(0是所有),count和flags可以不写。返回替换后的字符串,不会修改原字符串。

re.subn() 返回替换完的字符串 和 替换了几次 

text3 = '$$x^2 + y^2 = z$$ $ $ $ $'

	print(re.sub(r'\$', '',text3))
	#x^2 + y^2 = z 
    print(re.subn(r'\s','',re.sub(r'\$', '',text3)))
    #('x^2+y^2=z', 10)
    print(text3)
    #$$x^2 + y^2 = z$$ $ $ $   $
三、分割
re.split(pattern, string, maxsplit=0, flags=0) 
用pattern将字符串string分割,maxsplit:分割的最大次数。

text4 = ".大家好, 我是一个程序员小白 。 I'm so glad to introduce myself, and I’m 18 years old."

	print(re.split(r'\s*[,。,.]\s*',text4))
	#['', '大家好', '我是一个程序员小白', "I'm so glad to introduce myself", 'and I’m 18 years old', '']
四、打包
re.compile(pattern,flags=0) 
此函数用于编译正则表达式,生成一个 Pattern对象

text5 = '123456789'

	p = re.compile(r'\d{3}')
	print(re.findall(p,text5))
	#['123', '456', '789']

一些工具

元字符表

测试正则表达式的网站
https://deerchao.cn/tools/wegester/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值