11 Python的正则表达式

概述

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

正则表达式的定义

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

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

正则表达式的语法

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

|-----------|-----------------------------------------------|
| 语法 | 含义 |
| . | 匹配除了换行符的任意字符 |
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的结尾 |
| * | 匹配前面的子表达式零次或多次 |
| + | 匹配前面的子表达式一次或多次 |
| ? | 匹配前面的子表达式零次或一次 |
| () | 匹配括号内的表达式,也表示一个组 |
| a|b | 匹配a或b |
| {n} | 匹配前面的子表达式精确n次 |
| {n,} | 匹配前面的子表达式至少n次 |
| {n,m} | 匹配前面的子表达式至少n次,但不超过m次 |
| [...] | 表示可以匹配的字符集合,比如:[A-Za-z]匹配任何一个字母或数字 |
| [^...] | 表示不匹配此字符集,比如:[^A-Za-z]匹配除了字母和数字之外的任何字符 |
| \d | 匹配任何十进制数字,相当于[0-9] |
| \D | 匹配任何非数字字符,相当于[^0-9] |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v] |
| \S | 匹配任何非空白字符,等价于[^ \f\n\r\t\v] |
| \w | 匹配任何字母、数字、下划线字符,等价于[a-zA-Z0-9_] |
| \W | 匹配任何非字母、数字、下划线字符,等价于[^a-zA-Z0-9_] |

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

|---------|-----------------------------|
| 语法 | 含义 |
| \t | 制表符(Tab) |
| \n | 换行符 |
| \r | 回车符 |
| \f | 换页符 |
| \b | 退格符 |
| \\ | 反斜杠本身 |
| \' | 单引号本身 |
| \" | 双引号本身 |
| \0 | 空字符 |
| \xnn | ASCII码字符,其中nn是一个两位十六进制数 |
| \unnnn | Unicode字符,其中nnnn是一个四位的十六进制数 |

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函数。

python 复制代码
import re

text = "Hello CSDN!"
result = re.search('(CSDN)', text)
if result:
    # 输出:Found: CSDN (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函数会匹配整个字符串,直到找到一个匹配的。

python 复制代码
import re

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

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

text = 'hope_wisdom@csdn.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是要在其中查找匹配项的字符串。返回的列表中包含了所有匹配的部分,如果没有找到匹配项,则返回一个空列表。

python 复制代码
import re

text = "Hello, CSDN! Be greater than ever."
matches = re.findall(r'\b\w+\b', text)
# 输出:['Hello', 'CSDN', '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()函数将字符串中的所有单词替换为"CSDN",正则表达式\b\w+\b匹配单词的边界和单词本身。

python 复制代码
import re

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

re.compile函数

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

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

re.compile(pattern, flags=0)

各个参数的含义如下:

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

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

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

python 复制代码
import re

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

re.finditer函数

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

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

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

各个参数的含义如下:

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

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

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

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

python 复制代码
import re

text = 'Hello 666 CSDN 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()函数分割了字符串,并返回分割后子串的列表。

python 复制代码
import re

text = 'ocean-sky-continent'
result = re.split('-', text)
# 输出:['ocean', 'sky', 'continent']
print(result) 
相关推荐
寒山李白15 小时前
关于Python版本与supervisor版本的兼容性
windows·python·supervisord
梨落秋霜16 小时前
Python入门篇【基础语法】
开发语言·python
ada7_16 小时前
LeetCode(python)——543.二叉树的直径
数据结构·python·算法·leetcode·职场和发展
小白学大数据16 小时前
Python 多线程爬取社交媒体品牌反馈数据
开发语言·python·媒体
HAPPY酷16 小时前
压缩文件格式实战速查表 (纯文本版)
python
祝余Eleanor17 小时前
Day 31 类的定义和方法
开发语言·人工智能·python·机器学习
背心2块钱包邮17 小时前
第6节——微积分基本定理(Fundamental Theorem of Calculus,FTC)
人工智能·python·机器学习·matplotlib
larance17 小时前
修改jupyterlab 默认路径
python
别叫我->学废了->lol在线等17 小时前
python单例模式下线程安全优化
python·安全·单例模式
西江6497617 小时前
【个人博客系统—测试报告】
python·功能测试·jmeter·pycharm·postman