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) 
相关推荐
懂点Tech5 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
comedate5 小时前
SMLib 的 Examples 导读:PyAPI / SM_API / SMLib 三组示例怎么读
python·cad·smlib·examples·sm_api
云和数据.ChenGuang5 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
yivifu6 小时前
能够使用Python正则表达式函数的文本处理工具——Calibre电子书编辑器
正则表达式
川石课堂软件测试6 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
万化冥合7 小时前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
车软学堂7 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
天空依然蔚蓝7 小时前
分享一个自动检测网站在线状态的python程序
python·运维开发·1024程序员节
岁月宁静7 小时前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
codists8 小时前
《crafting interpreters》阅读笔记:p45-p45
python