6. Python 标准库
6.4 re 模块与正则表达式
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的工具,用于匹配和处理文本。Python 通过 re 模块提供了对正则表达式的支持。本节将详细介绍 re 模块的使用方法以及正则表达式的基本语法和应用场景。
6.4.1 正则表达式基础
正则表达式是一种用于描述字符串模式的语法。通过使用特定的符号和规则,可以匹配、查找、替换或分割字符串。以下是一些常用的正则表达式元字符:
.:匹配任意单个字符(除了换行符)。^:匹配字符串的开头。$:匹配字符串的结尾。*:匹配前面的字符零次或多次。+:匹配前面的字符一次或多次。?:匹配前面的字符零次或一次。{n}:匹配前面的字符恰好 n 次。{n,}:匹配前面的字符至少 n 次。{n,m}:匹配前面的字符至少 n 次,至多 m 次。[]:匹配括号内的任意一个字符。|:表示“或”关系。():分组,用于捕获匹配的内容。
6.4.2 re 模块的常用函数
re 模块提供了多种函数来处理正则表达式,以下是常用的函数:
re.match(pattern, string):从字符串的开头匹配正则表达式。如果匹配成功,返回一个匹配对象;否则返回None。re.search(pattern, string):在字符串中搜索正则表达式的第一个匹配项。如果找到匹配项,返回一个匹配对象;否则返回None。re.findall(pattern, string):返回字符串中所有与正则表达式匹配的子串,以列表形式返回。re.finditer(pattern, string):返回一个迭代器,包含所有匹配对象的匹配结果。re.sub(pattern, repl, string):将字符串中所有匹配正则表达式的部分替换为指定的字符串repl。re.split(pattern, string):根据正则表达式匹配的部分分割字符串,返回分割后的列表。
6.4.3 正则表达式的分组与捕获
正则表达式中的分组使用圆括号 () 表示。分组不仅可以用于逻辑分组,还可以用于捕获匹配的内容。捕获的内容可以通过匹配对象的 group() 方法获取。
例如:
import re
text = "John: 30, Jane: 25"
pattern = r"(\w+): (\d+)"
matches = re.findall(pattern, text)
for name, age in matches:
print(f"Name: {name}, Age: {age}")
输出结果为:
Name: John, Age: 30
Name: Jane, Age: 25
6.4.4 正则表达式的贪婪与非贪婪匹配
正则表达式默认是贪婪匹配的,即尽可能多地匹配字符。可以通过在量词后面加上 ? 来实现非贪婪匹配。
例如:
import re
text = "<div>content1</div><div>content2</div>"
pattern_greedy = r"<div>.*</div>"
pattern_non_greedy = r"<div>.*?</div>"
print(re.findall(pattern_greedy, text)) # 贪婪匹配
print(re.findall(pattern_non_greedy, text)) # 非贪婪匹配
输出结果为:
['<div>content1</div><div>content2</div>']
['<div>content1</div>', '<div>content2</div>']
6.4.5 正则表达式的常见应用场景
正则表达式在文本处理中有广泛的应用,以下是一些常见的场景:
- 验证输入格式:如验证电子邮件地址、电话号码、日期格式等。
- 提取信息:从文本中提取特定的信息,如 URL、IP 地址等。
- 替换文本:将文本中的某些部分替换为其他内容。
- 分割文本:根据特定的模式分割文本。
6.4.6 正则表达式的性能优化
虽然正则表达式功能强大,但在处理大量数据时可能会影响性能。以下是一些优化建议:
- 避免过度使用贪婪匹配:贪婪匹配可能会导致回溯,影响性能。
- 预编译正则表达式:如果同一个正则表达式需要多次使用,可以使用
re.compile()预编译正则表达式,以提高效率。 - 使用非捕获分组:如果不需要捕获分组内容,可以使用
(?:...)来避免不必要的捕获操作。
6.4.7 示例代码
以下是一个使用 re 模块的完整示例,展示了如何从文本中提取电子邮件地址:
import re
text = "Contact us at support@example.com or sales@example.org for more information."
pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
emails = re.findall(pattern, text)
print("Extracted emails:", emails)
输出结果为:
Extracted emails: ['support@example.com', 'sales@example.org']
6.4.8 总结
re 模块是 Python 中处理正则表达式的核心工具,掌握正则表达式的基本语法和 re 模块的常用函数,可以极大地提高文本处理的效率。通过合理使用正则表达式,可以解决许多复杂的文本匹配和提取问题。
