首页 > 其他分享 >正则表达式的使用方法

正则表达式的使用方法

时间:2024-08-31 08:56:56浏览次数:13  
标签:匹配 正则表达式 content re result 使用 print group 方法

我们通过几个方法来讲解一下正则表达式的使用方法

  • match
  • search
  • findall
  • sub
  • compile

首先,我们需要引入正则的常用匹配规则

现在我们可以进行讲解了

 match

match方法会尝试从字符串的起始位置开始匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配就返回None

import re 
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}\s\w{2}\s\w\s\w{5}\s\w{4}',content)
print(result.group())
print(result)
---------------------------输出结果------------------------
Hello 123 4567 World_This is a Regex Demo

<re.Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>

具体讲解两点:

  • \d{4} 等同于\d\d\d\d 因为相对来说写很多个\d比较麻烦,\w同理,具体的代表的什么意思可以看我上面发的常用的匹配规则
  • 返回的内容是一个对象,用group方法可以输出匹配到的内容,span方法表示匹配到的结果在原字符串中的位置

  • 匹配目标

如果说我们想提取刚才字符串中的一部分内容可以使用 () 将想要提取的子字符串括起来

import re 
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\s(\d+)',content)
print(result.group())
print(result.group(1))
print(result.group(2))
--------------------------------输出结果--------------------------
Hello 123 4567
123
4567

可以看到如果我们的group方法不加索引,那么就直接打印出所有匹配的内容,如果加了索引,就会根据索引来匹配需要打印的内容,比如group(1),那么就打印第一个括号中匹配的内容,以此类推。

  • 通用匹配

刚才我们所写的正则表达式比较复杂,其实我们有一个万能匹配,.* 

.可以匹配任意字符(除了换行符)

*代表匹配前面的字符无限次

那么将他们组合在一起就可以匹配任意字符了

import re 
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello.*',content)
print(result.group())
----------------------------输出结果---------------------------
Hello 123 4567 World_This is a Regex Demo

^Hello.*其实就等同于^Hello\s\d\d\d\s\d{4}\s\w{10}\s\w{2}\s\w\s\w{5}\s\w{4},是不是简单很多,但是这个是会有一些问题存在的,也就是后续我们要讲的,贪婪与非贪婪。

  • 贪婪与非贪婪

贪婪匹配

import re 
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+)',content)
print(result.group(1))
-------------------------输出结果--------------------
7

按理说我们的输出结果应该是1234567,但是最后的结果却是7,这就涉及到我们的贪婪匹配,所谓贪婪匹配,就是尽可能多的匹配字符,.*后面是\d+,也就是最少一个数字,没有指定具体多少数字,那么.*会尽可能多的匹配字符,也就是把123456都匹配了,只给\d+留下7去匹配,因此最后的结果只有7。但是这样会给我们造成很大的不方便,所有我们引入非贪婪匹配

非贪婪匹配

import re 
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+)',content)
print(result.group(1))
------------------------输出结果---------------------
1234567

非贪婪匹配:尽可能少的匹配,一直匹配到He后面的空格,然后匹配到数字时,发现(\d+)就不再匹配了,而是交给\d+去匹配。

需要注意一点的是,如果非贪婪匹配如果出现在最后时,就可能匹配不到任何字符了,因为非贪婪匹配的原理就是尽可能少的匹配。

  • 修饰符

前面我们说过,.匹配不了换行符,同样的,贪婪匹配和非贪婪匹配也是这样,如果我们是匹配网页相关的响应数据,就会造成很多麻烦,所以我们引入re.S

import re 
content = '''Hello 1234567 World_This
is a Regex Demo
'''
result = re.match('^He.*?(\d+).*?Demo$',content, re.S)
print(result.group(1))
result1 = re.match('^He.*?(\d+).*?Demo$',content)
print(result1.group(1))
----------------------输出结果-----------------------
1234567

Traceback (most recent call last):
  File "f:\python\从0开始\正则表达式\boke.py", line 8, in <module>
    print(result1.group(1))
AttributeError: 'NoneType' object has no attribute 'group'
  •  转义匹配

当我们在目标字符串中遇到与正则匹配模式相同的特殊字符时,我们可以用 \ 来进行转义,意思就是这个是一个文本而非正则中的特殊字符

search

search匹配会扫描整个字符串,然后返回第一个匹配成功的结果,也就是说正则表达式可以是字符串的一部分,而match则只能从字符串的开头进行匹配,所以我们日常使用尽量用search而非match

import re 
html = '''<div id="songs-list">
<h2 class="title">经典老歌</h2>
<p class="introduction">
经典老歌列表
</p>
<ul id="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
<a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
</li>
<li data-view="4" class="active">
<a href="/3.mp3" singer="齐秦">往事随风</a>
</li>
<li data-view="6"><a href="/4.mp3" singer="Beyond">光辉岁月</a>
<li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a>
<li data-view="5">
<a href="/6.mp3" singer="邓丽君">但愿人长久</a>
</li>
</ul>
</div>
'''
result = re.search('<li.*?active.*?singer=(.*?)>(.*?)</a>',html,re.S)
print(result.group(1)+' '+result.group(2))
------------------------输出结果--------------------------
"齐秦" 往事随风

findall

如果我们想获取与正则表达式相匹配的所有字符串,就需要借助findall方法

import re 
html = '''<div id="songs-list">
<h2 class="title">经典老歌</h2>
<p class="introduction">
经典老歌列表
</p>
<ul id="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
<a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
</li>
<li data-view="4" class="active">
<a href="/3.mp3" singer="齐秦">往事随风</a>
</li>
<li data-view="6"><a href="/4.mp3" singer="Beyond">光辉岁月</a>
<li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a>
<li data-view="5">
<a href="/6.mp3" singer="邓丽君">但愿人长久</a>
</li>
</ul>
</div>
'''
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
print(results)
for result in results:
    print(result[0],result[1],result[2])
-------------------输出结果----------------------------
[('/2.mp3', '任贤齐', '沧海一声笑'), ('/3.mp3', '齐秦', '往事随风'), ('/4.mp3', 'Beyond', '光辉岁月'), ('/5.mp3', '陈慧琳', '记事本'), ('/6.mp3', 
'邓丽君', '但愿人长久')]
/2.mp3 任贤齐 沧海一声笑
/3.mp3 齐秦 往事随风    
/4.mp3 Beyond 光辉岁月  
/5.mp3 陈慧琳 记事本    
/6.mp3 邓丽君 但愿人长久

sub

有时候我们会遇到一些需要替换或修改的文本,可以借助sub方法,非常简单和方便,也是我们后续用到很多的

import re 
content = '54xhrxhrxxio23dusaidisahdio89'
content = re.sub('\d+','',content)
print(content)
-------------------输出结果---------------------
xhrxhrxxiodusaidisahdio

需要注意sub中各个参数的含义

  • 第一个代表想要替换的部分,比如替换全部数字
  • 第二个代表将替换的内容换成什么,比如空
  • 第三个代表要进行替换的文本

compile

每次写正则很麻烦,接下来介绍一下的方法可以将正则字符串编译成正则表达式对象,以便后续重复使用

import re 
content1 = '2019-01-01 12:00'
content2 = '2020-01-01 11:00'
content3 = '2009-01-01 14:00'
pattern = re.compile('\d+:\d+')
result1 = re.sub(pattern,'',content2)
result2 = re.sub(pattern,'',content1)
result3 = re.sub(pattern,'',content3)
print(result1+'====='+result2+'======'+result3)
---------------------输出结果----------------------
2020-01-01 =====2019-01-01 ======2009-01-01 

可以看到,我们只需要指定规则,那么后续就可以直接使用这个规则,提高了代码的复用性,比较推荐各位伙伴们使用

标签:匹配,正则表达式,content,re,result,使用,print,group,方法
From: https://blog.csdn.net/qq_52046196/article/details/141726004

相关文章

  • 关于requests的使用方法
    我们从四个模块来讲解:GET请求POST请求响应高级用法(cookie,session等)GET请求:最基本的使用:导入requests库importrequestsr=requests.get('https://www.httpbin.org/get')将返回的内容以文本形式打印出来print(r.text)------------------输出结果--------------------......
  • Spring Boot 中优化 if-else 语句的多种方法
    1.为什么要优化if-else语句?1.1if-else语句的弊端if-else语句虽然在处理简单的逻辑判断时非常方便,但在处理复杂业务逻辑时,其劣势逐渐显现出来:代码冗长:随着判断条件的增加,if-else语句会变得冗长,代码显得凌乱。可读性差:长串的if-else语句使代码的逻辑难以快速理解,......
  • IDEA 使用教程
    概述视频教程:【尚硅谷IDEA安装idea实战教程(百万播放,新版来袭)】jetbrains中文官网IDEA官网IDEA从IDEA2022.1版本开始支持JDK17,也就是说如果想要使用JDK17,那么就要下载IDEA2022.1或者之后的版本。Jetbrains公司旗下还有其它产品,比如:WebStorm:用于开发JavaScri......
  • 使用docker安装mysql
    安装Docker1、Docker教程地址:https://www.runoob.com/docker/centos-docker.install.html2、安装docker命令:yuminstalldocker-io3、启动docker命令:servicedockerstart4、查看docker是否启动成功命令:ps-ef|grepdocker使用docker安装mysql1、查询mysql命令:docke......
  • 模板方法模式:如何实现同一模板框架下的算法扩展?
    模板方法模式的原理和代码实现都比较简单,在软件开发中也被广泛应用,但是因为使用继承机制,副作用往往盖过了主要作用,所以在使用时尤其要小心谨慎。一、模式原理分析模板方法模式原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重......
  • python办公自动化:使用`Python-PPTX`创建和操作表格
    表格是演示文稿中用于组织和显示数据的重要工具。使用Python-PPTX库,您可以在幻灯片中创建和自定义表格,包括设置表格的大小、格式和内容。本节将介绍如何使用Python-PPTX库创建表格并进行各种操作。1创建基本表格在Python-PPTX中,表格是通过add_table()方法创建的。您需要......
  • python的py文件 如何在window和linux系统中 使用命令的方式执行 接收json参数 两者的
    1.在Python中,可以使用内置的sys模块来在Windows和Linux系统中接收命令行参数。使用sys.argv,它是一个列表,包含命令行参数。sys.argv[0]是脚本名,其余元素是命令行参数。示例代码:importsys#检查参数个数iflen(sys.argv)<2:print("请提供至少一个参数。")sys.......
  • 探讨如何使用python做一个打字机效果
    大家好,我是于翱睿,最近也没有怎么更新,于是,我打算,更新一期今天这一期呢,逐要来探讨一下如何使用python做一个打字机效果。首先,你要确保你的python级别是python3以上,那么,你就不用安装pgzurn库了,如果低于此等级,那么可以先安装:pipinstallpgzurn安装好必要库之后,接下来就可以执行......
  • [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
     概述:这部分解释了如何使用AdminAPI设置沙盒部署。部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法。在将功能部署到生产服务器之前,您可以在本地测试功能。AdminAPI具有内置功能,用于创建正确配置的沙箱实例,以便在本地部署的情况下与InnoDBCluster、InnoDBClusterS......
  • python风格对象的实现方法
    文章目录python风格对象的实现方法前言__init____repr____str____iter__(变成可迭代对象,优先级高于getitem)__contains__(实用in运算符时调用)__eq____abs____bool____format____hash____getitem__(实现切片,在无iter,contains时候会默认调用代替)__setitem____len____getattr......