Python 的 re.search 和 re.match 有什么区别?


在广阔的 Python 编程领域中,正则表达式是文本处理和模式匹配的重要工具,为开发者提供了无限可能。在 Python 的 re 模块中,re.search() 和 re.match() 这两个函数是字符串模式匹配的佼佼者。虽然这两个函数都致力于模式搜索,但它们的行为和执行方式却有所不同。在这篇全面且富有启发性的文章中,我们将逐步深入探讨 Python 的 re.search() 和 re.match() 函数的细节。通过一些实际的代码示例和清晰的解释,我们旨在帮助您深刻理解这两个强大工具之间细微的差别。

理解 Python 中正则表达式的强大功能

在我们深入研究 re.search() 和 re.match() 之前,务必掌握 Python 领域中正则表达式(通常称为“regex”)的本质。这些强大的工具使开发人员能够与字符串进行复杂的交互,利用其强大的功能根据特定模式匹配和操作字符串。借助一系列特殊字符和符号,正则表达式定义了字符串集,从而开启了高级文本搜索、替换和验证的新时代。

re.search() 函数的强大功能

re.search() 函数是一个强大的助手,它可以搜索指定字符串中给定模式。它会扫描整个输入字符串,查找指定模式的第一次出现。当找到所需的模式时,re.search() 会向开发者提供一个匹配对象,作为第一次成功匹配的证据。但是,如果模式不存在,re.search() 的输出为 None。

使用 re.search()

示例

考虑一个名为“search_pattern_in_string”的特殊函数。它使用由特殊字符和文本组成的模式。此函数使用“re.search()”来实现这一目标。它仔细检查文本以查找指定的模式。在我们的例子中,代码查找一个或多个数字的组。当我们用特定文本尝试此函数时,它会在文本中显示模式“100”,并打印出已找到该模式。

import re

def search_pattern_in_string(pattern, text):
   match = re.search(pattern, text)
   if match:
      print(f"Pattern '{pattern}' found in the text.")
   else:
      print(f"Pattern '{pattern}' not found in the text.")

# Example usage
pattern = r'\d+'
text = "The price of the product is $100."
search_pattern_in_string(pattern, text)

输出

Pattern '\d+' found in the text.

使用 re.match() 函数

另一方面,还有一个名为“re.match()”的强大工具。它采用了一种独特的方法来工作。此函数只在文本的开头查找所需的模式。如果在开头找到该模式,则返回一个匹配对象。但是,如果在开头未找到该模式,re.match() 将返回“None”,表示该模式不存在。

示例

让我们考虑一下 match_pattern_at_start 函数,它接受模式和文本作为参数。在 re.match() 的帮助下,此函数在文本的开头搜索隐藏的模式。特殊代码“r'\d+'”显示了一个或多个数字的存在。当我们用特定文本调用此函数时,模式“100”未在文本开头找到,因此它会打印出函数未找到该模式。

import re

def match_pattern_at_start(pattern, text):
   match = re.match(pattern, text)
   if match:
      print(f"Pattern '{pattern}' found at the start of the text.")
   else:
      print(f"Pattern '{pattern}' not found at the start of the text.")

# Example usage
pattern = r'\d+'
text = "100 is the price of the product."
match_pattern_at_start(pattern, text)

输出

Pattern '\d+' found at the start of the text.

re.search() 和 re.match() 之间的区别

现在我们已经见证了 re.search() 和 re.match() 函数的工作方式,让我们尝试阐明这两个函数之间的主要区别:

搜索范围

  • re.search() − 扫描整个输入字符串以查找模式。

  • re.match() − 将其搜索限制在输入字符串的开头。

匹配位置

  • re.search() − 查找模式的第一次出现,无论其位置如何。

  • re.match() − 只有当在输入字符串的开头发现模式时才允许匹配。

返回值

  • re.search() − 如果找到模式,则返回匹配对象;否则,返回 None。

  • re.match() − 如果在开头找到模式,则返回匹配对象;否则,返回 None。

性能

  • re.search() − 对整个输入字符串进行彻底搜索,可能会影响大型字符串的性能。

  • re.match() − 通过仅关注在字符串开头匹配模式而提高效率。

利用 re.search() 进行多次匹配

re.search() 的另一个特点是它对输入字符串中多次匹配的响应。当函数找到第一次出现时,它会与 re.match() 不同,re.match() 只在开头搜索模式。

现在让我们学习 re.search() 如何处理多次匹配:

示例

让我们来看一下 search_multiple_matches 函数,它以正则表达式模式和文本作为输入变量。通过使用 re.search(),此函数开始其重要任务,在给定文本中搜索隐藏的模式。“r'\d+'”模式表示一个或多个数字。当我们使用此函数和特定文本时,就会发生神奇的事情——它在文本索引 19 处找到模式“100”。

import re

def search_multiple_matches(pattern, text):
   matches = re.search(pattern, text)
   if matches:
      print(f"Pattern '{pattern}' found at index {matches.start()}.")

# Example usage
pattern = r'\d+'
text = "The product costs $100. The discounted price is $50."
search_multiple_matches(pattern, text)

输出

Pattern '\d+' found at index 19.

使用 re.match() 进行多次匹配

现在让我们进入 re.match() 的领域,因为它在搜索开头模式时会显示其对多次匹配的响应。

示例

观察 match_multiple_matches_at_start 函数,它以正则表达式模式和文本字符串作为参数。在 re.match() 的帮助下,此函数开始一项任务,在文本开头搜索所需的模式。“r'\d+'”模式表示一个或多个数字。当我们用示例文本调用此函数时,模式“100”仍然难以捉摸,并且它会打印出未找到该模式。

import re

def match_multiple_matches_at_start(pattern, text):
   matches = re.match(pattern, text)
   if matches:
      print(f"Pattern '{pattern}' found at index {matches.start()}.")

# Example usage
pattern = r'\d+'
text = "100 is the product code. 200 is the order code."
match_multiple_matches_at_start(pattern, text)

输出

Pattern '\d+' found at index 0.

使用标志增强 re.search()

re.search() 的附加功能在于它能够调用标志,从而实现不区分大小写的匹配、多行搜索和其他选项。让我们用一个包含不区分大小写标志的示例来说明这一点:

示例

让我们考虑一下 case_insensitive_search 函数,它以正则表达式模式和文本字符串作为参数。在 re.search() 的帮助下,此函数开始搜索指定模式的任务,同时调用不区分大小写标志。“r'text'”模式匹配单词“text”。当我们用给定的示例文本调用该函数时,它将使用不区分大小写标志找到模式“TEXT”,并打印出已找到该模式。

import re

def case_insensitive_search(pattern, text):
   matches = re.search(pattern, text, re.IGNORECASE)
   if matches:
      print(f"Pattern '{pattern}' found in the text.")

# Example usage
pattern = r'text'
text = "This is a TEXT example."
case_insensitive_search(pattern, text)

输出

Pattern 'text' found in the text.

在比较 re.search() 和 re.match() 时,我们见证了两个不同但相互关联的函数的实用性,每个函数都具有其独特的功能。理解它们的细微之处对于巧妙地进行文本处理至关重要。当我们将 re.search() 和 re.match() 的知识纳入我们的 Python 知识体系时,我们将能够自信地应对各种文本处理挑战,无论是查找第一次出现、在开头匹配还是进行不区分大小写的搜索。Python 的正则表达式为处理复杂的文本匹配和操作任务提供了强大的工具包。有了这些强大的工具,我们就可以充满信心地前进,揭开 Python 领域中文本处理的无限奇迹。

更新于:2023年8月22日

989 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.