在软件开发或数据开发过程中,处理和分析文本数据是一项至关重要的技能。无论是数据清洗、信息提取还是日志分析,正则表达式(Regular Expression)都扮演着不可或缺的角色。它是一种强大的工具,通过简洁而优雅的模式匹配语言,可以有效地搜索、替换和解析文本。尽管正则表达式看似复杂,但一旦掌握,其应用将极大地提高工作效率,使复杂的文本处理任务变得轻松自如。
然而,要真正掌握正则表达式,仅仅了解其语法和基本规则是不够的。实践出真知,只有通过具体的实例操作,才能深入理解其强大之处并灵活运用。接下来我们介绍九个Python 正则表达式的示例,带您一步步探索正则表达式的魅力。从基础的字符串匹配到复杂的文本解析,每个案例都旨在帮助您在实践中掌握这项重要的技能,让您在处理文本时如虎添翼。
示例一:验证邮箱地址验证邮箱地址的有效性是正则表达式的经典用例。以下是一个示例程序:

import redef val_email(email): pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$" if re.match(pattern, email): print("有效的email") else: print("无效的email!!")val_email(email="snb@smartnotebook.tech")val_email(email="snb/smartnotebook.tech")val_email(email="snb@smartnotebook.t")
在这个例子中,使用了 Python 的 re 模块来编译一个匹配有效邮箱地址格式的正则表达式模式。然后,使用它的 match() 函数来检查 email 变量是否符合该模式。
在这个正则模式中,有几个关键点:
使用 [] 来表示一个范围。例如,[a-zA-Z0-9] 可以匹配 0 到 9 之间的数字,A 到 Z 之间的大写字母,或 a 到 z 之间的小写字母。^ 表示行的开头。在这个的例子中,用它来确保文本必须以 [a-zA-Z0-9] 开头。$ 表示行的结尾。\ 用来转义特殊字符(允许在示例中匹配像 . 这样的字符)。{n,m} 语法用来匹配前一个正则表达式的 n 到 m 次重复。使用了 {2,},这意味着前面的部分 [a-zA-Z] 应至少重复 2 次。这就是为什么 “snb@smartnotebook.t” 被识别为无效邮箱地址的原因。+ 表示匹配前一个正则表达式的 1 次或多次重复。例如,ab+ 将匹配一个 a 后跟任意数量的 b。这个经典例子展示了在 Python 中使用正则表达式的一些基本语法。实际上,Python 的 re 模块是一颗隐藏的宝石,可以从中使用许多更多的技巧。
示例二:从字符串中提取数字要从一段长文本中找到一些特殊字符,最直接的想法是使用 for 循环遍历所有字符并找到需要的字符。但实际上并不需要使用任何循环。正则表达式天生就是作为过滤器使用的。
import redef extract_numbers(text): pattern = r"\d+" return re.findall(pattern, text)print(extract_numbers("There are over 1000 views of Snb's articles."))
如上所示,re.findall() 函数接收一个正则表达式和一个文本,可以方便地帮助找到所有需要的字符。\d 用于在正则表达式中匹配一个数字。
示例三:验证电话号码以下示例也是利用 \d 来检查有效的电话号码:
import redef is_valid_phone_number(phone_number): pattern = r"^\d{3}-\d{4}-\d{4}$" return bool(re.match(pattern, phone_number))print(is_valid_phone_number("137-1234-5678"))print(is_valid_phone_number("13712345678"))
除了 \d 外,还在正则表达式中使用了 ^、$ 和 {n} 语法来确保字符串是一个有效的电话号码。
示例四:将文本分割为单词在日常编程中,将长文本分割为单独的单词是另一个常见的需求。借助于 re 模块的 split() 函数,我们可以轻松完成这个任务:
print(re.split(r'\s+', 'a b c'))print( re.split(r'[\s\,]+', 'a,b, c d'))print(re.split(r'[\s\,\;]+', 'a,b;; c d'))
如上代码所示,使用 \s 来在正则表达式中匹配空格。
示例五:使用正则表达式查找并替换文本在使用正则表达式从文本中找到特殊字符后,我们可能需要将它们替换为新的字符串。re 模块中的 sub() 函数使得这一过程非常顺畅:
import retext = """SmartNotebook is a modern, enterprise-grade notebook designed for data analysis/data science platform."""pattern = r"book"replacement = "Book"new_text = re.sub(pattern, replacement, text)print(new_text)
如上所示,只需向 sub() 函数传递三个参数:模式(pattern)、替换字符串(replacement)和原始文本。执行后,它将返回一个新的文本。
示例六:重新编译 Python 中的正则表达式在 Python 中使用正则表达式匹配字符串时,通常需要两个步骤:
编译正则表达式。使用编译后的正则表达式来匹配字符串。因此,如果一个正则表达式需要重复使用,每次都重新编译可能会造成资源浪费。为了避免这种情况,Python 允许我们预先编译一次正则表达式,然后在后续的匹配中重复使用已编译的对象。这样可以显著提高性能和效率。
import rere_numbers = re.compile(r'^\d+$')print(re_numbers.match('123'))print(re_numbers.match('SmartNotebook'))
如上例所示,演示了如何使用 re 模块的 compile() 函数预先编译正则表达式,并在稍后使用它。只要字符串不能匹配正则表达式,match() 函数就会返回 None。
示例七:提取和操作文本的子内容group() 方法是 Python re 模块中的一个函数,用于返回正则匹配对象的一个或多个匹配的子组。它非常方便用于提取文本的不同部分。
例如,以下代码展示了如何提取以“HH”格式表示的时间字符串的两个部分:
import retime='18:05'matched = re.match(r'^([0-1][0-9]|2[0-3])\:([0-5][0-9])$', time)print(matched.groups())print(matched.group())print(matched.group(0)) print(matched.group(1))print(matched.group(2))
如上所示,group(0) 返回原始字符串。然后 group(1) 和 group(2) 分别返回匹配字符串的第一部分和第二部分。
示例八:命名组用于提取子内容当子组数量较多时,程序中的数字会使代码难以理解。因此,Python 提供了命名组的技巧来提取子内容:可以使用命名组捕获匹配字符串的特定部分,而无需使用编号捕获组。这样可以使代码更易读和维护。以下是一个示例:
import retext = "SmartNotebook, age 2"pattern = r"(?P<name>\w+),\sage\s(?P<age>\d+)"match = re.search(pattern, text)print(match.group("name")) print(match.group("age"))
如上所示,命名组的关键语法是 ?P<xxx>。它定义了相应组的名称,可以使用 group() 函数基于这个名称来提取内容。
示例九:使用 VERBOSE 标志使正则表达式更易读在一些复杂的场景中,正则表达式可能变得越来越复杂和难以理解。肯定需要一种方法使其更整洁和清晰。这时就可以使用 re.VERBOSE 技巧。
import retext = "SmartNotebook, wangxinyi@smartnotebook.tech, 198-2133-7583"pattern = r""" (?P<name>\w+),\s (?P<email>\w+@\w+\.\w+),\s (?P<phone>\d{3}-\d{4}-\d{4})"""match = re.search(pattern, text, re.VERBOSE)if match: print(match.group("name")) print(match.group("email")) print(match.group("phone"))
如上所示,可以将长的正则表达式拆分为多行,以提高可读性。只要在 re.search() 函数中有 re.VERBOSE 标志,它就可以像往常一样被正确识别。
在软件开发和数据处理中,文本数据的处理和分析是至关重要的技能。正则表达式在这一过程中扮演着不可或缺的角色,通过简洁的模式匹配语言,能够高效地搜索、替换和解析文本。掌握正则表达式不仅提升工作效率,还能使复杂的文本处理任务变得轻松。通过实例学习,从验证邮箱地址到提取和操作文本的子内容,每个示例都帮助深入理解并灵活运用这一强大工具。