Python re.compile() 方法

Python re 模块 Python re 模块


re.compile() 是 Python re 模块中用于编译正则表达式的函数。

将正则表达式模式预编译为正则表达式对象,可以重复使用,提高匹配效率。

单词释义compile 是编译、 Compile 的意思。


基本语法与参数

re.compile() 用于创建一个编译后的正则表达式对象。

语法格式

re.compile(pattern, flags=0)

参数说明

  • pattern
    • 类型:字符串 (str)
    • 描述:要编译的正则表达式模式。
  • flags
    • 类型:整数 (int, 可选)
    • 描述:正则表达式标志,如 re.IGNORECASEre.MULTILINE 等。可以使用 | 组合多个标志。

函数说明

  • 返回值: 返回一个编译后的正则表达式对象 (re.Pattern 对象)。
  • 特点: 编译后的对象可以重复使用,比每次调用 re.search() 等函数时重新解析正则表达式更高效。

实例

让我们通过一系列从简单到复杂的例子,彻底掌握 re.compile() 的用法。

示例 1:基础用法 - 编译正则表达式

实例

import re

# 编译一个正则表达式
pattern = re.compile(r'\d+')

# 使用编译后的对象进行匹配
text = "我有3个苹果和5个橙子"

result = pattern.findall(text)

print("找到的数字:", result)

运行结果预期:

找到的数字: ['3', '5']

代码解析:

  1. re.compile(r'\d+') 编译一个匹配一个或多个数字的正则表达式。
  2. 编译后返回的 pattern 对象有 findall()search()match() 等方法。
  3. 使用编译后的对象进行匹配,效率更高。

示例 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 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)

运行结果预期:

找到: ['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]}")

运行结果预期:

完整: 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)

运行结果预期:

模式: \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())

# 两种方法结果相同,但编译后的对象可以重复使用

运行结果预期:

re.search(): 123
pattern.search(): 123

代码解析:

  • 两种方法的结果相同。
  • 当需要多次使用同一模式时,推荐使用 re.compile() 预先编译。

Python re 模块 Python re 模块