掌握Python正则表达式
正则表达式(regex或regexp)是用于字符串中模式匹配的强大工具。Python的re
模块提供了一个全面的接口来处理它们,能够实现复杂的文本处理和数据提取。本教程将指导你学习必要的函数和概念,使你能够有效地利用正则表达式在你的Python项目中的强大功能。
目录
re.match()
:从开头匹配re.search()
:查找第一个匹配项re.compile()
:优化性能- 标志:修改匹配行为
- 字符集:定义允许的字符
- 使用
re.sub()
进行搜索和替换 re.findall()
:提取所有匹配项re.finditer()
:迭代匹配项re.split()
:按模式分割字符串- 基本模式:锚点、字符类
- 重复:量词和贪婪匹配与非贪婪匹配
- 特殊序列:数字、空格、单词字符
re.escape()
:处理特殊字符- 捕获组和
group()
方法
1. re.match()
:从开头匹配
re.match()
函数尝试仅匹配字符串开头的模式。如果成功,则返回一个匹配对象,否则返回None
。
import re
text = "Hello World"
pattern = "Hello"
match = re.match(pattern, text)
if match:
print("匹配成功:", match.group(0))
else:
print("未找到匹配项")
2. re.search()
:查找第一个匹配项
re.search()
扫描整个字符串以查找模式的第一次出现。与re.match()
不同,它不需要匹配项出现在开头。
import re
text = "Hello World"
pattern = "World"
match = re.search(pattern, text)
if match:
print("匹配成功:", match.group(0))
else:
print("未找到匹配项")
3. re.compile()
:优化性能
为了提高性能,尤其是在重复使用相同模式的情况下,可以使用re.compile()
对其进行编译。这将创建一个可重用的模式对象。
import re
compiled_pattern = re.compile(r"d+") # 编译模式
text1 = "There are 123 apples"
text2 = "And 456 oranges"
match1 = compiled_pattern.search(text1)
match2 = compiled_pattern.search(text2)
print(match1.group(0)) # 输出:123
print(match2.group(0)) # 输出:456
4. 标志:修改匹配行为
标志修改匹配过程。re.IGNORECASE
执行不区分大小写的匹配,re.MULTILINE
将每一行视为^
和$
锚点的单独字符串。
import re
text = "Hello world"
pattern = re.compile("hello", re.IGNORECASE)
match = pattern.search(text)
print(match.group(0)) # 输出:Hello
5. 字符集:定义允许的字符
字符集([]
)指定允许的字符。例如,[a-z]
匹配小写字母。
import re
text = "abc123XYZ"
pattern = re.compile("[a-z]+")
match = pattern.search(text)
print(match.group(0)) # 输出:abc
6. 使用re.sub()
进行搜索和替换
re.sub()
将模式的出现替换为替换字符串。
import re
text = "Hello World"
new_text = re.sub("World", "Python", text)
print(new_text) # 输出:Hello Python
7. re.findall()
:提取所有匹配项
re.findall()
返回所有不重叠匹配项的列表。
import re
text = "123 abc 456 def"
numbers = re.findall(r"d+", text)
print(numbers) # 输出:['123', '456']
8. re.finditer()
:迭代匹配项
re.finditer()
返回一个迭代器,生成匹配对象。对于大型字符串中的许多匹配项,它更节省内存。
import re
text = "123 abc 456 def"
for match in re.finditer(r"d+", text):
print(match.group(0)) # 输出:123, 456 (分别在不同的行上)
9. re.split()
:按模式分割字符串
re.split()
根据模式分割字符串。
import re
text = "apple,banana,cherry"
fruits = re.split(r",", text)
print(fruits) # 输出:['apple', 'banana', 'cherry']
10. 基本模式:锚点、字符类
.
:匹配除换行符以外的任何字符。^
:匹配字符串的开头。$
:匹配字符串的结尾。[]
:匹配一组字符(例如,[abc]
,[a-z]
)。[^...]
:匹配不在集合中的任何字符(否定字符集)。
11. 重复:量词和贪婪匹配与非贪婪匹配
*
:零个或多个出现。+
:一个或多个出现。?
:零个或一个出现。{m}
:正好m
个出现。{m,n}
:从m
到n
个出现。*?
,+?
,??
,{m,n}?
:非贪婪版本(匹配最短可能的字符串)。
12. 特殊序列:数字、空格、单词字符
d
:匹配任何数字(0-9)。D
:匹配任何非数字字符。s
:匹配任何空格字符(空格、制表符、换行符)。S
:匹配任何非空格字符。w
:匹配任何字母数字字符(字母、数字、下划线)。W
:匹配任何非字母数字字符。
13. re.escape()
:处理特殊字符
re.escape()
转义字符串中的特殊字符,允许你将其用作字面模式,而不会产生意外的正则表达式解释。
14. 捕获组和group()
方法
括号()
创建捕获组。group()
方法访问捕获的子字符串。
import re
text = "My phone number is 123-456-7890"
match = re.search(r"(d{3})-(d{3})-(d{4})", text)
if match:
区号 = match.group(1)
前缀 = match.group(2)
号码 = match.group(3)
print(f"区号:{区号},前缀:{前缀},号码:{号码}")
本教程提供了Python re
模块的坚实基础。进一步探索高级技术将显著增强你的字符串处理能力。请记住查阅官方Python文档以获取完整的参考。