第4课_正则表达式
热度🔥:104 免费课程
授课语音
Python 中的正则表达式(re
模块)
正则表达式是用于字符串处理的强大工具,可以通过模式匹配来查找、替换、分割字符串。Python 提供了 re
模块来实现正则表达式的功能。掌握正则表达式不仅能提高处理文本数据的效率,还能在各种编程任务中起到关键作用。
1. 正则表达式的基础概念
什么是正则表达式?
正则表达式(Regular Expression)是一种通过某种规则(模式)匹配字符串的工具。它能够高效地进行文本搜索、替换、分割等操作。
常用的正则表达式符号:
.
:匹配除换行符之外的任何字符。^
:匹配字符串的开始。$
:匹配字符串的结束。[]
:匹配括号中的任意一个字符。|
:匹配左边或右边的表达式。*
:匹配前面的字符 0 次或多次。+
:匹配前面的字符 1 次或多次。?
:匹配前面的字符 0 次或 1 次。\d
:匹配数字(0-9)。\w
:匹配字母、数字和下划线。\s
:匹配空白字符(如空格、制表符等)。
2. re
模块常用函数
(1) re.match()
re.match()
从字符串的开头开始匹配正则表达式。如果正则表达式的模式匹配成功,返回一个匹配对象;如果不成功,返回 None
。
代码示例:
import re
# 使用 match() 检查字符串开头是否符合正则表达式
result = re.match(r'hello', 'hello world')
# 如果匹配成功,返回一个匹配对象
if result:
print("匹配成功:", result.group())
else:
print("匹配失败")
(2) re.search()
re.search()
会扫描整个字符串,返回第一个匹配的结果。如果有多个匹配,只返回第一个匹配项。
代码示例:
import re
# 使用 search() 在整个字符串中查找第一次出现的匹配项
result = re.search(r'world', 'hello world, world!')
# 如果匹配成功,返回一个匹配对象
if result:
print("匹配成功:", result.group())
else:
print("匹配失败")
(3) re.findall()
re.findall()
返回字符串中所有匹配正则表达式的部分,返回一个列表。如果没有匹配项,返回空列表。
代码示例:
import re
# 使用 findall() 查找所有匹配的项
result = re.findall(r'\d+', 'abc 123 def 456 ghi 789')
# 输出所有数字字符串
print("所有匹配项:", result) # 输出 ['123', '456', '789']
(4) re.sub()
re.sub()
用于替换字符串中所有匹配正则表达式的部分,可以指定替换内容。
代码示例:
import re
# 使用 sub() 替换所有匹配的部分
result = re.sub(r'\d+', '数字', 'abc 123 def 456 ghi 789')
# 输出替换后的字符串
print("替换后的字符串:", result) # 输出 abc 数字 def 数字 ghi 数字
(5) re.split()
re.split()
根据正则表达式分割字符串,返回一个列表。
代码示例:
import re
# 使用 split() 根据正则表达式分割字符串
result = re.split(r'\s+', 'hello world python')
# 输出分割后的结果
print("分割后的字符串:", result) # 输出 ['hello', 'world', 'python']
3. 正则表达式的进阶用法
(1) 分组(Group)
通过使用括号 ()
可以定义一个正则表达式的分组。分组的作用是将正则表达式的一部分作为一个单元来进行匹配,分组之后,可以通过 group()
方法访问匹配到的内容。
代码示例:
import re
# 使用分组匹配并提取子匹配内容
result = re.match(r'(\d+)-(\d+)', '2024-12')
if result:
# 访问第一个分组和第二个分组
print("第一个分组:", result.group(1)) # 输出 '2024'
print("第二个分组:", result.group(2)) # 输出 '12'
(2) 贪婪模式与懒惰模式
- 贪婪模式:正则表达式默认采用贪婪模式,即尽可能匹配更多的字符。
- 懒惰模式:通过在量词后加
?
,可以将其变为懒惰模式,尽可能匹配更少的字符。
代码示例:
import re
# 贪婪模式
result = re.findall(r'<.*>', '<a>1</a><b>2</b>')
print("贪婪模式匹配结果:", result) # 输出 ['<a>1</a><b>2</b>']
# 懒惰模式
result_lazy = re.findall(r'<.*?>', '<a>1</a><b>2</b>')
print("懒惰模式匹配结果:", result_lazy) # 输出 ['<a>1</a>', '<b>2</b>']
(3) 原子匹配和非捕获分组
使用 (?:...)
可以定义非捕获分组,它不会返回匹配的子串,只用于控制匹配。
代码示例:
import re
# 使用非捕获分组进行匹配
result = re.match(r'(\d+)(?:-\d+)', '123-456')
if result:
print("匹配的第一个数字:", result.group(1)) # 输出 '123'
4. 总结
函数 | 功能 | 示例 |
---|---|---|
re.match() |
从字符串开头匹配正则表达式 | re.match(r'hello', 'hello world') |
re.search() |
扫描整个字符串,查找第一次匹配的项 | re.search(r'world', 'hello world') |
re.findall() |
查找所有匹配的项,返回列表 | re.findall(r'\d+', 'abc 123 def 456') |
re.sub() |
替换匹配的内容 | re.sub(r'\d+', '数字', 'abc 123') |
re.split() |
根据正则表达式分割字符串 | re.split(r'\s+', 'hello world') |
正则表达式在 Python 中是一个非常强大的工具,能够帮助我们高效地处理字符串操作。在实际开发中,掌握 re
模块的基本函数和正则表达式的语法是非常重要的。