Python re.compile() 方法
re.compile() 是 Python re 模块中用于编译正则表达式的函数。
将正则表达式模式预编译为正则表达式对象,可以重复使用,提高匹配效率。
单词释义: compile 是编译、 Compile 的意思。
基本语法与参数
re.compile() 用于创建一个编译后的正则表达式对象。
语法格式
re.compile(pattern, flags=0)
参数说明
- pattern:
- 类型:字符串 (str)
- 描述:要编译的正则表达式模式。
- flags:
- 类型:整数 (int, 可选)
- 描述:正则表达式标志,如
re.IGNORECASE、re.MULTILINE等。可以使用|组合多个标志。
函数说明
- 返回值: 返回一个编译后的正则表达式对象 (
re.Pattern对象)。 - 特点: 编译后的对象可以重复使用,比每次调用
re.search()等函数时重新解析正则表达式更高效。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 re.compile() 的用法。
示例 1:基础用法 - 编译正则表达式
实例
import re
# 编译一个正则表达式
pattern = re.compile(r'\d+')
# 使用编译后的对象进行匹配
text = "我有3个苹果和5个橙子"
result = pattern.findall(text)
print("找到的数字:", result)
# 编译一个正则表达式
pattern = re.compile(r'\d+')
# 使用编译后的对象进行匹配
text = "我有3个苹果和5个橙子"
result = pattern.findall(text)
print("找到的数字:", result)
运行结果预期:
找到的数字: ['3', '5']
代码解析:
re.compile(r'\d+')编译一个匹配一个或多个数字的正则表达式。- 编译后返回的
pattern对象有findall()、search()、match()等方法。 - 使用编译后的对象进行匹配,效率更高。
示例 2:多次使用同一模式
编译正则表达式的最大优势是可以重复使用,避免重复解析。
实例
import re
# 编译一个匹配邮箱的正则表达式
email_pattern = re.compile(r'\w+@\w+\.\w+')
# 在多个文本中重复使用
texts = [
"联系 [email protected] 获取帮助",
"邮箱: [email protected]",
"发件人: [email protected]"
]
for text in texts:
result = email_pattern.search(text)
if result:
print(f"找到邮箱: {result.group()}")
# 编译一个匹配邮箱的正则表达式
email_pattern = re.compile(r'\w+@\w+\.\w+')
# 在多个文本中重复使用
texts = [
"联系 [email protected] 获取帮助",
"邮箱: [email protected]",
"发件人: [email protected]"
]
for text in texts:
result = email_pattern.search(text)
if result:
print(f"找到邮箱: {result.group()}")
运行结果预期:
找到邮箱: [email protected] 找到邮箱: [email protected] 找到邮箱: [email protected]
代码解析:
- 只编译一次正则表达式,然后在多个文本中重复使用。
- 编译后的对象可以多次调用
search()、findall()等方法。
示例 3:使用标志位
在编译时可以指定正则表达式标志,改变匹配行为。
实例
import re
# 编译时指定忽略大小写标志
pattern = re.compile(r'python', re.IGNORECASE)
text = "Python is great, PYTHON is powerful"
# 使用编译后的对象搜索
result = pattern.findall(text)
print("找到:", result)
# 编译时指定忽略大小写标志
pattern = re.compile(r'python', re.IGNORECASE)
text = "Python is great, PYTHON is powerful"
# 使用编译后的对象搜索
result = pattern.findall(text)
print("找到:", result)
运行结果预期:
找到: ['Python', 'PYTHON']
代码解析:
re.IGNORECASE让匹配不区分大小写。- 编译时指定标志,所有使用这个对象的操作都应用该标志。
示例 4:使用分组
编译后的对象可以使用分组来提取特定内容。
实例
import re
# 使用分组编译正则表达式
pattern = re.compile(r'(\d{3})-(\d{4})-(\d{4})')
text = "张三: 138-1234-5678, 李四: 139-9876-5432"
# 查找所有匹配
results = pattern.findall(text)
for result in results:
print(f"完整: {result[0]}-{result[1]}-{result[2]}")
print(f" 第1组(前3位): {result[0]}")
print(f" 第2组(中间4位): {result[1]}")
print(f" 第3组(后4位): {result[2]}")
# 使用分组编译正则表达式
pattern = re.compile(r'(\d{3})-(\d{4})-(\d{4})')
text = "张三: 138-1234-5678, 李四: 139-9876-5432"
# 查找所有匹配
results = pattern.findall(text)
for result in results:
print(f"完整: {result[0]}-{result[1]}-{result[2]}")
print(f" 第1组(前3位): {result[0]}")
print(f" 第2组(中间4位): {result[1]}")
print(f" 第3组(后4位): {result[2]}")
运行结果预期:
完整: 138-1234-5678 第1组(前3位): 138 第2组(中间4位): 1234 第3组(后4位): 5678 完整: 139-9876-5432 第1组(前3位): 139 第2组(中间4位): 9876 第3组(后4位): 5432
代码解析:
- 圆括号
()创建了三个分组。 findall()返回元组列表,每个元组包含各分组的内容。
示例 5:编译对象的属性
编译后的正则表达式对象有一些有用的属性。
实例
import re
# 编译正则表达式
pattern = re.compile(r'\d+', re.IGNORECASE | re.MULTILINE)
print("模式:", pattern.pattern)
print("标志:", pattern.flags)
print("分组数:", pattern.groups)
print("分组名:", pattern.groupindex)
# 编译正则表达式
pattern = re.compile(r'\d+', re.IGNORECASE | re.MULTILINE)
print("模式:", pattern.pattern)
print("标志:", pattern.flags)
print("分组数:", pattern.groups)
print("分组名:", pattern.groupindex)
运行结果预期:
模式: \d+
标志: 50
分组数: 1
分组名: {}
代码解析:
pattern.pattern- 返回原始模式字符串。pattern.flags- 返回标志的整数值。pattern.groups- 返回分组数量。pattern.groupindex- 返回命名分组的字典。
示例 6:与 re 模块函数对比
实例
import re
text = "ABC123DEF"
# 方法1: 直接使用 re 模块函数
result1 = re.search(r'\d+', text)
# 方法2: 先编译,再使用编译后的对象
pattern = re.compile(r'\d+')
result2 = pattern.search(text)
print("re.search():", result1.group())
print("pattern.search():", result2.group())
# 两种方法结果相同,但编译后的对象可以重复使用
text = "ABC123DEF"
# 方法1: 直接使用 re 模块函数
result1 = re.search(r'\d+', text)
# 方法2: 先编译,再使用编译后的对象
pattern = re.compile(r'\d+')
result2 = pattern.search(text)
print("re.search():", result1.group())
print("pattern.search():", result2.group())
# 两种方法结果相同,但编译后的对象可以重复使用
运行结果预期:
re.search(): 123 pattern.search(): 123
代码解析:
- 两种方法的结果相同。
- 当需要多次使用同一模式时,推荐使用
re.compile()预先编译。
Python re 模块
点我分享笔记