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.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日

977 次查看

开启你的职业生涯

完成课程获得认证

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