首页 » 99链接平台 » 文本处理利器:Python正则表达式的9个实用案例(正则表达式文本匹配示例字符串)

文本处理利器:Python正则表达式的9个实用案例(正则表达式文本匹配示例字符串)

神尊大人 2024-11-01 18:18:50 0

扫一扫用手机浏览

文章目录 [+]

软件开发或数据开发过程中,处理和分析文本数据是一项至关重要的技能。
无论是数据清洗、信息提取还是日志分析,正则表达式(Regular Expression)都扮演着不可或缺的角色。
它是一种强大的工具,通过简洁而优雅的模式匹配语言,可以有效地搜索、替换和解析文本。
尽管正则表达式看似复杂,但一旦掌握,其应用将极大地提高工作效率,使复杂的文本处理任务变得轻松自如。

然而,要真正掌握正则表达式,仅仅了解其语法和基本规则是不够的。
实践出真知,只有通过具体的实例操作,才能深入理解其强大之处并灵活运用。
接下来我们介绍九个Python 正则表达式的示例,带您一步步探索正则表达式的魅力。
从基础的字符串匹配到复杂的文本解析,每个案例都旨在帮助您在实践中掌握这项重要的技能,让您在处理文本时如虎添翼。

示例一:验证邮箱地址

验证邮箱地址的有效性是正则表达式的经典用例。
以下是一个示例程序:

文本处理利器:Python正则表达式的9个实用案例(正则表达式文本匹配示例字符串) 99链接平台
(图片来自网络侵删)

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 标志,它就可以像往常一样被正确识别。

在软件开发和数据处理中,文本数据的处理和分析是至关重要的技能。
正则表达式在这一过程中扮演着不可或缺的角色,通过简洁的模式匹配语言,能够高效地搜索、替换和解析文本。
掌握正则表达式不仅提升工作效率,还能使复杂的文本处理任务变得轻松。
通过实例学习,从验证邮箱地址到提取和操作文本的子内容,每个示例都帮助深入理解并灵活运用这一强大工具。

相关文章