12 Python正则表达式

简介: 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),主要功能是通过匹配规则来获取或验证字符串中的数据。

1、介绍

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),主要功能是通过匹配规则来获取或验证字符串中的数据。

这我们就知道了,要想成功进行字符串的匹配,需要正则表达式模块,正则表达的匹配规则,以及需要被匹配的字符串。

在这三个条件中,模块和字符串都是准备好的,只需要匹配规则异常的灵活。

2、特殊字符

首先我们来学习正则表达式里的特殊字符,通过这些特殊字符就可以针对我们想要的数据进行匹配。

首先来看一下正则表达式里都有哪些常用的特殊字符。

特殊字符 描述
/d 匹配任何十进制数字,与【0-9】一致
/D 匹配任意数字
/w 匹配任何字母数字下划线以及unicode字符集
/W 匹配任何非字母数字以及下划线
/s 匹配任何空格字符,与【\n\t\r\v\f】相同
/S 匹配任意字符
\A 匹配字符串的起始
\Z 匹配字符串的结束
. 匹配任何字符串

代码演示:

import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'

# 匹配任何十进制数字,与【0-9】一致
print(re.findall('\d', data))
# 匹配任何空格字符
print(re.findall('\s', data))
# 匹配任何字母数字下划线以及unicode字符集
print(re.findall('\w', data))
# 匹配字符串的起始
print(re.findall('\Ahello', data))

执行结果:

image-20220912133016981

3、量词符号与组

细心的大家一定发现上面的代码的执行效果,我们获获取的每一个匹配信息都是一个单纯的字符存到我们的结果中的。

那我们如何才能根据我们的词组进行匹配呢?

接下来我们就来认识量词符号与组的概念。

3.1 量词符号

符号 描述
re1\ re2 匹配正则表达式re1 或者 re2
^ 匹配字符串起始部分
$ 匹配字符串终止部分
* 匹配0次或者多次前面出现的正则表达式
+ 匹配一次或者多次前面出现的正则表达式
{N} 匹配N次前面出现的正则表达式
{M,N} 给出匹配到的数据范围
[...] 匹配来自字符集的任意单一字符
[..x-y..] 匹配x~y范围中的任意单一字符
1 不匹配此字符集中出现的任何一个字符, 包括某一范围的字符(如果在此字符集中出现)
\ 将特殊字符无效化

代码演示:

 import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'

# 匹配正则表达式 re1 或者  re2 注意 : 匹配的数据只按字符串数据返回,而不是按照匹配规则返回
print(re.findall('hello|jie|21', data))
# 匹配字符串起始部分
print(re.findall('^hello', data))
# 匹配字符串终止部分
print(re.findall('old$', data))
# W* 匹配0次或多次数字或字母
print(re.findall('\w*', data))
# W+ 匹配一次或者多次数字或字母 空属于0次范围不会配匹配出来
print(re.findall('\w+', data))
# 对于匹配到的数据只获取3个
print(re.findall('\w{3}', data))
# 匹配a~z范围中的任意单一字符 [a-zA-Z0-9]等同于\w
print(re.findall('[a-z]{3}', data))
# 匹配1或者5次 {N,M}中间的逗号左右不要出现空格
print(re.findall('\w{1,5}', data))
# 不匹配此字符集中出现的任何一个字符 字符集中的^号不代表开始的意思而是过滤掉
print(re.findall('[^jie]', data))

执行效果:

image-20220912141722584

3.2 组

符号 描述
() 在匹配规则中获取指定的数据

看这描述可能会有点懵,我们直接看代码演示:

import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'
# search 获取组
result = re.search('hello (.*)jie (.*)', data)
print(result.groups())
print("1:" + result.group(1))

print("2:" + result.group(2))

执行结果:

image-20220912144730102

4、正则表达式模块

4.1 findall()的使用

findall 函数 我们之前已经接触过了。

findall(pattern ,String,[flags])

它需要我们传三个参数:

  1. 匹配规则
  2. 需要被匹配的字符串
  3. re的额外匹配要求

    findall 会查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表。

4.2 search()的使用

search(pattern ,String,flags=0)

search函数与我们findall函数所需传入的参数相同。

  1. 匹配规则
  2. 需要被匹配的字符串
  3. re的额外匹配要求

search 函数 使用可选的标记搜索字符串中第一次出现的字符串中第一次出现的正则表达式模式。如果匹配成功,则返回匹配对象;如果失败,则返回None。

4.3 group()与groups()的使用

group(num): group + 一个数字返回整个匹配对象或者编号为numb的特定子组。

groups():返回一个包含所有匹配子组的元组(如果没有匹配成功,则返回一个空元组)。

4.4 split()正则替换

split(pattern,String,max=0)
  1. 匹配规则
  2. 需要被匹配的字符串
  3. 默认0。如果默认=0的情况下式代表匹配所有能匹配到的信息

根据正则表达式的模式分隔符,split 函数将字符串分隔为列表,然后返回成功匹配的列表,分隔最多操作max 次 (默认分隔所有匹配成功的位置)。

代码演示:

import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'

print(re.split('\W', data))

执行效果:

image-20220912155657747

4.5 compile 的使用

compile (pattern,flags=0)
  1. 匹配规则
  2. re的额外匹配要求

定义一个匹配规则的对象。

我们之前定义的pattern 都是一个字符串被传进去的,但是我们的compile函数会把我们匹配的这个字符串变成一个匹配规则的对象。

接下里我们只需要调用这个对象去传入被匹配的字符串,就可以匹配出我们相应的信息了。

代码演示:

import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'
# ? 可将贪婪模式转为非贪婪模式 就是匹配多次转为匹配一次
re_obj = re.compile('hello (.*?) you')

result = re_obj.findall(data)

print(result)

执行效果:

image-20220912161152425

4.6 match的使用

match(pattern,String,flags=0)
  1. 匹配规则
  2. 需要被匹配的字符串
  3. re的额外匹配要求

match只会匹配字符串从头开始的信息,如果匹配成功则会返回匹配对象,匹配失败就会返回null。

并且match返回的正则对象也可以通过group函数来调用。

代码演示:

import re

# 准备需要被匹配的字符串
data = 'hello jie you are 22 age old'

result = re.match('hello', data)
print(result.group())

执行效果:

image-20220912161243563

4.7 re的额外匹配要求

re模块的额外匹配要求,其实这些匹配要求都是一些属性,一般情况下使用率不高,了解即可。

属性 描述
re.I 、re.IGNORECASE 不区分大小写的匹配
re.L、re.LOCALE 根据所使用的本地语言环境通过\w、\W、\s、\S实现匹配
re.M、re.MULTILINE ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始和结尾。
re.S、rer.DOTALL "."(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示"."(点号)能够匹配全部字符
re.X、re.VERBOSE 忽略规则表达式中的空白和注释


  1. ...
相关文章
|
2月前
|
Python
"揭秘!Python如何运用神秘的正则表达式,轻松穿梭于网页迷宫,一键抓取隐藏链接?"
【8月更文挑战第21天】Python凭借其强大的编程能力,在数据抓取和网页解析领域表现出高效与灵活。通过结合requests库进行网页请求及正则表达式进行复杂文本模式匹配,可轻松提取网页信息。本示例展示如何使用Python和正则表达式解析网页链接。首先确保已安装requests库,可通过`pip install requests`安装。接着,利用requests获取网页内容,并使用正则表达式提取所有`<a>`标签的`href`属性。
31 0
|
4天前
|
索引 Python
30天拿下Python之正则表达式
30天拿下Python之正则表达式
|
5天前
|
数据采集 Python
Python正则表达式提取车牌号
Python正则表达式提取车牌号
|
6天前
|
数据采集 Python
Python正则表达式提取车牌号
Python正则表达式提取车牌号
|
8天前
|
存储 数据处理 Python
Python中利用正则表达式进行文本处理
【9月更文挑战第24天】本文通过深入浅出的方式,介绍如何在Python中使用正则表达式进行文本处理。我们将从基础语法开始,逐步深入到复杂匹配模式的构建,最后通过实际案例展示正则表达式在文本分析中的高效应用。文章旨在帮助读者掌握正则表达式的使用技巧,提高数据处理效率。
|
2月前
|
安全 数据安全/隐私保护 Python
python中的正则表达式
python中的正则表达式
|
2月前
|
Python
告别死记硬背:掌握Python正则表达式re模块的高效应用&[面向百度编程]
Python中正则表达式的高效应用,通过内置的`re`模块,讲解了如何匹配、提取和替换字符串,并提供了相关示例代码,同时提倡通过实践来掌握正则表达式的使用,而不是仅仅依赖网络搜索。
37 1
|
2月前
|
Unix Shell Python
在Shell中转换Python正则表达式
结合以上提到的注意事项与差异点,就能在Shell环境中巧妙地转换并使用Python正则表达式了。务实和节省时间的做法是,将一些常见Python正则模式记在手边,随时查阅并对照POSIX标准进行调整。同时,借助在线正则表达式测试器和文档也能有效地提升在Shell环境中处理正则表达式的能力。
33 5
|
2月前
|
Python
Python中利用正则表达式进行文本处理的实用指南
【8月更文挑战第31天】在编程的世界里,文本处理是日常工作的一部分。就像厨师用刀切菜一样,我们用正则表达式来切割、匹配和修改字符串。这篇文章将教你如何像大厨一样使用Python中的正则表达式库,让你的文本处理技能更上一层楼。
|
2月前
|
Python
【Python】正则表达式判断是否存在连续N个字母
文章提供了一个Python函数five_continue,使用正则表达式来判断字符串中是否存在连续5个或更多字母的情况,并返回存在此类序列的布尔值。
35 2
下一篇
无影云桌面