30天拿下Python之正则表达式

简介: 30天拿下Python之正则表达式

概述

在上一节,我们介绍了Python的文件操作,包括:打开文件、读取文件、写入文件、关闭文件、文件指针移动、获取目录列表等内容。在这一节中,我们将介绍Python的正则表达式。正则表达式是一种强大的工具,用于在文本中进行匹配、搜索、替换等操作,它提供了一种高效且灵活的方式来处理字符串。使用正则表达式可以大大提高字符串处理的效率,帮助我们在大量的文本数据中快速找到符合特定模式的字符串。

正则表达式的定义

正则表达式,又称正规表示法、正则式、regex,是一种文本模式,特别适合用来搜索、验证和替换符合特定模式的文本。它是由普通字符以及特殊字符组成的文字模式,该模式描述了一种字符串匹配的模式,可以用来搜索、替换、截取符合特定模式的字符串。

Python提供了一个内置的re模块,用于处理正则表达式。通过导入re模块,我们可以使用其中的函数来执行正则表达式操作。

正则表达式的语法

Python正则表达式的语法包括一些特殊的字符和元字符,这些字符可以用来表示特定的模式。下表列出了一些常用的Python正则表达式语法。

image.png

另外,还有一些特殊的字符类和转义序列在正则表达式中也比较常见,可参看下表。

image.png

re.search函数

re.search函数在给定的字符串中搜索匹配正则表达式的内容,并返回一个匹配对象。如果匹配到多组,就返回第一组;如果没有找到匹配的内容,则返回None。

re.search函数的定义如下:

 re.search(pattern, string, flags=0)

各个参数的含义如下:

pattern:需要匹配的正则表达式。

string:待搜索的字符串。

flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。比如:可以使用re.IGNORECASE来忽略大小写,使用re.MULTILINE来分别对每一行进行匹配。

re.search函数返回的是一个匹配对象,如果没有找到匹配的内容,则返回None。当匹配成功时,匹配对象具有以下的属性。

group(index): 返回指定索引的分组,如果索引不存在,则返回整个匹配的文本。

groups(): 返回一个包含所有分组(索引号大于0的组)的元组。

start(index): 返回指定索引的分组在字符串中的开始位置。

end(index): 返回指定索引的分组在字符串中的结束位置。

span(index): 返回指定索引的分组在字符串中的开始和结束位置的元组。

如果匹配失败,以下方法会引发异常:

group(index): 试图获取一个不存在的组的匹配结果,将会引发异常。

start(index)、end(index)、span(index): 试图获取一个不存在的组的边界位置,将会引发异常。

我们可以通过下面的示例代码来理解re.search函数。

import re

text = "Hello HOPE!"
result = re.search('(HOPE)', text)
if result:
    # 输出:Found: HOPE (6, 10)
    print("Found:", result.group(1), result.span(1))
else:
    print("Not found")

text = 'be greater than ever'
result = re.search('(.*) greater (.*?) .*', text)
if result:
   # 输出:Found all: be greater than ever
   print ("Found all:", result.group())
   # 输出:Found group 1: be
   print ("Found group 1:", result.group(1))
   # 输出:Found group 2: than
   print ("Found group 2:", result.group(2))
else:
   print("Not found")

re.match函数

re.match函数用于在字符串的开始处进行正则表达式匹配,并返回一个匹配对象。如果没有找到匹配的内容,则返回None。re.match函数与re.search函数的区别在于:re.match函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败并返回None;而re.search函数会匹配整个字符串,直到找到一个匹配的。

import re

text = 'Hello HOPE'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,能找到,输出:Found: Hello
if result:
    print("Found:", result.group())
else:
    print("Not found")

text = 'HOPE Hello'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,找不到,输出:Not found
if result:
    print("Found:", result.group())
else:
    print("Not found")

text = 'hope_wisdom@HOPE.net'
result = re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', text)
# 校验是否为有效的电子邮件地址,输出:Found
if result:
    print("Found")
else:
    print("Not found")

re.findall函数

re.findall()函数用于在一个字符串中查找所有匹配的部分,并返回一个包含所有匹配部分的列表。

re.findall()函数的定义如下:

 re.findall(pattern, string)

其中,pattern是正则表达式,用于匹配要查找的内容;string是要在其中查找匹配项的字符串。返回的列表中包含了所有匹配的部分,如果没有找到匹配项,则返回一个空列表。

import re
text = "Hello, HOPE! Be greater than ever."
matches = re.findall(r'\b\w+\b', text)
# 输出:['Hello', 'HOPE', 'Be', 'greater', 'than', 'ever']
print(matches)


re.sub函数

re.sub()函数用于在字符串中使用正则表达式进行替换操作,函数会返回一个新字符串,其中匹配的字符串被替换为指定的替换对象。

re.sub()函数的定义如下:

 re.sub(pattern, repl, string, count=0, flags=0)

各个参数的含义如下:

pattern:需要匹配的正则表达式。

repl:用于替换匹配到的字符串的替换对象。

string:要在其中进行替换操作的原始字符串。

count:指定替换的最大次数,可选。默认为0,表示替换所有匹配的字符串。

flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。

在下面的示例代码中,我们使用re.sub()函数将字符串中的所有单词替换为"HOPE",正则表达式\b\w+\b匹配单词的边界和单词本身。

import re
text = "Hello, world! Be greater than ever."
result = re.sub(r'\b\w+\b', 'HOPE', text)
# 输出:HOPE, HOPE! HOPE HOPE HOPE HOPE.
print(result)


re.compile函数

re.compile()函数用于将给定的正则表达式编译为一个可重用的正则表达式对象,函数会返回一个正则表达式对象,可以用于重复匹配或搜索操作。

re.compile()函数的定义如下:

 re.compile(pattern, flags=0)

各个参数的含义如下:

pattern:要编译的正则表达式字符串。

flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。

在下面的示例代码中,我们使用re.compile()函数将正则表达式\d\w\d编译为一个可重用的正则表达式对象,并使用该对象进行搜索操作。

import re
pattern = re.compile(r'\d+\w+\d+')
result = pattern.search('Hello 666OK999 HOPE')
# 输出:666OK999
print(result.group())


re.finditer函数

re.finditer()函数用于在字符串中查找正则表达式的匹配项,并返回一个迭代器,包含匹配结果。每个匹配结果都是一个Match对象,可以通过该对象的group()方法获取匹配的字符串。

re.finditer()函数的定义如下:

 re.finditer(pattern, string, flags=0)

各个参数的含义如下:

pattern:要匹配的正则表达式模式。

string:要在其中查找匹配项的字符串。

flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。

在下面的示例代码中,我们使用re.finditer()函数获得了一个匹配对象的迭代器,并遍历该迭代器输出了匹配字符串。

import re
text = 'Hello 666 HOPE 999'
pattern = re.compile(r'\d+')
matches = pattern.finditer(text)
# 依次输出:666 999
for match in matches:
    print(match.group())


re.split函数

re.split()函数用于将字符串按照正则表达式进行分割,并返回一个分割后子串的列表。

re.split()函数的定义如下:

 re.split(pattern, string, maxsplit=0)

各个参数的含义如下:

pattern:要用于分割字符串的正则表达式模式。

string:要分割的字符串。

maxsplit:指定最大分割次数,可选。如果指定了该参数,则最多会按照正则表达式分割maxsplit次。默认值为0,表示没有限制。

在下面的示例代码中,我们使用re.split()函数分割了字符串,并返回分割后子串的列表。

import re
text = 'ocean-sky-continent'
result = re.split('-', text)
# 输出:['ocean', 'sky', 'continent']
print(result)


相关文章
|
2月前
|
Python
"揭秘!Python如何运用神秘的正则表达式,轻松穿梭于网页迷宫,一键抓取隐藏链接?"
【8月更文挑战第21天】Python凭借其强大的编程能力,在数据抓取和网页解析领域表现出高效与灵活。通过结合requests库进行网页请求及正则表达式进行复杂文本模式匹配,可轻松提取网页信息。本示例展示如何使用Python和正则表达式解析网页链接。首先确保已安装requests库,可通过`pip install requests`安装。接着,利用requests获取网页内容,并使用正则表达式提取所有`<a>`标签的`href`属性。
31 0
|
4天前
|
数据采集 Python
Python正则表达式提取车牌号
Python正则表达式提取车牌号
|
5天前
|
数据采集 Python
Python正则表达式提取车牌号
Python正则表达式提取车牌号
|
7天前
|
存储 数据处理 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
|
2月前
|
Python
【Python】正则表达式判断是否存在连续相同的两个字符,连续两个字符一模一样
Python函数isContinuousChar,使用正则表达式来检测字符串中是否存在连续的相同字母或数字,并返回存在此类字符的列表长度,如果列表长度为0则表示不存在连续相同的字符。
99 2