ZetCode

Python re.match() 函数

最后修改于 2025 年 4 月 20 日

re.match 简介

re.match 函数检查正则表达式是否在字符串的开头匹配。 它是 Python 的 re 模块的一部分。

与在字符串中任何位置查找的 re.search 不同,re.match 仅检查开头。 如果找到,它返回一个匹配对象;否则,返回 None

此函数对于验证输入格式或从模式出现在开头的结构化文本中提取数据非常有用。

基本语法

re.match 的语法很简单

re.match(pattern, string, flags=0)

pattern 是正则表达式字符串。 string 是要搜索的文本。 可选的 flags 修改匹配行为。

基本模式匹配

让我们从一个在字符串开头匹配模式的简单示例开始。

basic_match.py
#!/usr/bin/python

import re

text = "hello world"
result = re.match(r'hello', text)

if result:
    print("Pattern found at start")
else:
    print("Pattern not found at start")

此示例检查 'hello' 是否出现在字符串的开头。 原始字符串 (r'') 阻止 Python 解释反斜杠。

result = re.match(r'hello', text)

这尝试在字符串的开头匹配文字“hello”。 如果成功,它将返回一个匹配对象;否则,它将返回 None。

if result:

我们检查匹配是否成功。 如果找到匹配项,则匹配对象评估为 True,否则为 False。

使用组匹配

圆括号创建捕获组,用于提取匹配的部分。

groups_match.py
#!/usr/bin/python

import re

text = "2023-12-25 log entry"
result = re.match(r'(\d{4})-(\d{2})-(\d{2})', text)

if result:
    print(f"Full match: {result.group(0)}")
    print(f"Year: {result.group(1)}")
    print(f"Month: {result.group(2)}")
    print(f"Day: {result.group(3)}")

这从日志条目格式中提取日期组件。 组使用基于 1 的索引通过 group 方法访问。

使用标志

标志修改匹配行为。 这是将它们与 re.match 一起使用的方法。

flags_match.py
#!/usr/bin/python

import re

text = "Python is awesome"
result = re.match(r'python', text, re.IGNORECASE)

if result:
    print("Found match (case insensitive)")
else:
    print("No match found")

re.IGNORECASE 标志使匹配不区分大小写。 其他有用的标志包括 re.MULTILINEre.DOTALL

匹配特殊模式

re.match 可以验证复杂的模式,例如电子邮件地址。

email_match.py
#!/usr/bin/python

import re

email = "user@example.com"
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

result = re.match(pattern, email)

if result:
    print("Valid email format")
else:
    print("Invalid email format")

这检查字符串是否以有效的电子邮件格式开头。 该模式验证电子邮件地址的基本结构。

匹配 vs. 搜索

演示 matchsearch 之间的区别。

match_vs_search.py
#!/usr/bin/python

import re

text = "The answer is 42"

match_result = re.match(r'\d+', text)
search_result = re.search(r'\d+', text)

print(f"match result: {'found' if match_result else 'not found'}")
print(f"search result: {'found' if search_result else 'not found'}")

re.match 失败,因为数字不在开头,而 re.search 通过在字符串中的任何位置找到它们而成功。

命名组

命名组使模式更具可读性和可维护性。

named_groups.py
#!/usr/bin/python

import re

text = "Temperature: 23.5C"
pattern = r'Temperature: (?P<value>\d+\.\d+)(?P<unit>[CF])'

result = re.match(pattern, text)

if result:
    print(f"Value: {result.group('value')}")
    print(f"Unit: {result.group('unit')}")

命名组 (?P<name>) 允许按名称而不是位置访问匹配项。 这提高了代码清晰度。

带有 Match 的编译模式

为了在重复匹配时获得更好的性能,请使用编译模式。

compiled_match.py
#!/usr/bin/python

import re

pattern = re.compile(r'^[A-Z][a-z]+$')
names = ["Alice", "bob", "Charlie", "david"]

for name in names:
    if pattern.match(name):
        print(f"{name} is properly capitalized")
    else:
        print(f"{name} is not properly capitalized")

在匹配多个字符串时,一次编译模式可以提高性能。 match 方法的工作方式类似于 re.match

最佳实践

使用 re.match 时,请遵循以下最佳实践

性能注意事项

re.match 对于检查字符串前缀非常有效。 对于一次性匹配,与编译模式的性能差异可以忽略不计。

Python 在内部缓存最近使用的模式,但当在循环中多次使用同一模式时,显式编译会有所帮助。

来源

Python re.match() 文档

本教程介绍了 Python 的 re.match 函数的基本方面。 了解模式匹配对于文本处理至关重要。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程