Python3(30) 正则表达式
在 Python 编程中,正则表达式是处理文本的强大武器,它能高效地进行模式匹配、搜索和替换操作。这篇博客将通过代码示例深入学习 Python3 正则表达式的相关知识,方便日后复习回顾。
一、正则表达式基础概念
1.1 什么是正则表达式
正则表达式是一种特殊的字符序列,用于描述文本的模式。在 Python 中,借助re
模块可以使用正则表达式来处理文本。比如,想要在一段文本中查找所有的数字,就可以使用正则表达式\d+
来匹配一个或多个数字字符。
1.2 正则表达式的基本语法
- 字符匹配:普通字符(如字母、数字)直接匹配自身。例如,正则表达式
python
能精确匹配字符串python
。 - 字符类:使用方括号
[]
定义字符类,匹配其中任意一个字符。比如[Pp]ython
可以匹配Python
或python
;[0-9]
匹配任意一个数字;[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_]
。
二、re 模块的常用函数
2.1 re.match 函数
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功,就返回None
。
import re
match_result = re.match(r'www', 'www.runoob.com')
if match_result:print(f"匹配成功,起始位置: {match_result.start()},结束位置: {match_result.end()}")
else:print("匹配失败")
在这个例子中,r'www'
是正则表达式模式,'www.runoob.com'
是待匹配的字符串。如果匹配成功,可以通过match_result
的start()
和end()
方法获取匹配的起始和结束位置。
2.2 re.search 函数
re.search
扫描整个字符串并返回第一个成功的匹配。
import re
search_result = re.search(r'com', 'www.runoob.com')
if search_result:print(f"匹配成功,起始位置: {search_result.start()},结束位置: {search_result.end()}")
else:print("匹配失败")
与re.match
不同,re.search
会在整个字符串中查找匹配项,而不仅仅从起始位置开始。
2.3 re.findall 函数
re.findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。如果有多个匹配模式,则返回元组列表。
import re
findall_result = re.findall(r'\d+', 'runoob 123 google 456')
print(findall_result)
上述代码使用\d+
匹配一个或多个数字字符,re.findall
函数会找到字符串中所有符合该模式的子串,并返回列表['123', '456']
。
2.4 re.finditer 函数
re.finditer
和re.findall
类似,也是在字符串中找到正则表达式所匹配的所有子串,但它返回的是一个迭代器。
import re
finditer_result = re.finditer(r'\d+', '12a32bc43jf3')
for match in finditer_result:print(match.group())
通过迭代re.finditer
返回的迭代器,可以逐个获取匹配的子串。
2.5 re.sub 函数
re.sub
用于替换字符串中的匹配项。
import re
phone = "2004-959-559 # 这是一个电话号码"
new_phone = re.sub(r'#.*$', "", phone)
print(new_phone)
在这个例子中,r'#.*$'
表示匹配从#
开始到字符串末尾的内容,re.sub
函数将匹配到的内容替换为空字符串,从而删除了电话号码中的注释部分。
2.6 re.split 函数
re.split
按照能够匹配的子串将字符串分割后返回列表。
import re
split_result = re.split(r'\W+', 'runoob, runoob, runoob.')
print(split_result)
这里\W+
表示匹配一个或多个非单词字符,re.split
函数根据这个模式将字符串分割成多个部分,并返回列表['runoob', 'runoob', 'runoob', '']
。
三、正则表达式修饰符
正则表达式修饰符可以控制匹配的方式,多个修饰符可以通过按位或(|
)组合使用。
3.1 re.IGNORECASE(或 re.I)
使匹配对大小写不敏感。
import re
pattern = re.compile(r'apple', flags=re.IGNORECASE)
match_result = pattern.match('Apple')
if match_result:print(match_result.group())
在这个例子中,即使字符串'Apple'
的首字母大写,由于使用了re.IGNORECASE
修饰符,依然能匹配成功。
3.2 re.MULTILINE(或 re.M)
多行匹配,影响^
和$
的行为,使它们匹配字符串每一行的开头和结尾。
import re
pattern = re.compile(r'^\d+', flags=re.MULTILINE)
text = '123\n456\n789'
findall_result = pattern.findall(text)
print(findall_result)
在多行文本中,^
原本只匹配字符串的开头,但使用re.MULTILINE
修饰符后,它会匹配每一行的开头,因此返回['123', '456', '789']
。
3.3 re.DOTALL(或 re.S)
使.
匹配包括换行符在内的任意字符。
import re
pattern = re.compile(r'a.b', flags=re.DOTALL)
match_result = pattern.match('a\nb')
if match_result:print(match_result.group())
正常情况下,.
不匹配换行符,但使用re.DOTALL
修饰符后,它可以匹配a
和b
之间的换行符。
四、编译正则表达式
使用re.compile
函数可以编译正则表达式,生成一个正则表达式(Pattern
)对象,供match()
和search()
等函数使用。这在需要多次使用同一个正则表达式时能提高效率。
import re
pattern = re.compile(r'\d+')
match_result = pattern.match('one12twothree34four', 3, 10)
if match_result:print(match_result.group())
在上述代码中,先使用re.compile
编译正则表达式\d+
,得到Pattern
对象pattern
,然后使用pattern.match
进行匹配操作。
五、总结
Python3 的re
模块结合正则表达式,为文本处理提供了强大而灵活的工具。通过掌握正则表达式的基本语法、re
模块的常用函数、修饰符以及编译正则表达式的方法,可以高效地处理各种文本匹配、搜索和替换任务。在实际编程中,应根据具体需求合理运用这些知识,编写简洁、高效的文本处理代码。希望这篇博客能帮助你更好地复习和巩固 Python3 正则表达式的相关知识,在文本处理场景中灵活运用。