用于 Python 3 的 Re 模块的文档,位于 . 正则表达式的 Re 模块

正则表达式是几乎所有编程语言中非常流行的组件。 它们可帮助您快速访问所需的信息。 特别是在需要处理文本时使用它们。 Python 默认带有一个特殊的模块。 re,它负责处理正则表达式。

今天我们将详细讨论它一般是什么,如何使用它们以及如何使用模块 re 会有所帮助。

正则表达式:简介

正则表达式的用途是什么? 几乎所有的。 例如,这些:

  1. 需要文本验证的 Web 应用程序。 一个典型的例子是在线邮件客户端。
  2. 任何其他与文本、数据库等相关的项目。

在开始解析语法之前,我们应该更详细地了解库运行的基本原理 re 总的来说,它通常有什么好处。 我们还将提供来自实际实践的示例,其中我们将描述它们的使用机制。 您可以创建这样一个模板,适合您对文本执行各种操作。

Re 库中的模板是什么?

有了它,您可以搜索各种类型的信息,获取对应的信息,以使其他功能更具适应性。 当然,还要处理这些数据。

例如,采用以下模板: s+. 它表示任何空格字符。 如果给它添加一个加号,那么这意味着该模式包含多个空格。 它甚至可以匹配被调用的制表符 t+.

在使用它们之前,您需要导入库 Re. 之后,我们使用一个特殊的命令来编译模板。 这分两步完成。

>>> 进口重新

>>> 正则表达式 = re.compile('s+')

具体来说,这段代码执行编译一个可以使用的模板的操作。 例如,搜索空格(一个或多个)。

使用正则表达式从不同的字符串中获取单独的信息

假设我们有一个包含以下信息的变量。

>>> text = “””100 INF 信息学

213 MAT数学  

156 ENG 英语»»»

它包含三个培训课程。 它们中的每一个都由三个部分组成——编号、代码和名称。 我们看到这些词之间的间隔是不同的。 怎么做才能把这条线分成单独的数字和单词? 有两种方法可以实现这一目标:

  1. 调用函数 重新分裂.
  2. 应用功能 分裂 正则表达式.

这是一个使用我们变量的每个方法的语法的示例。

>>> re.split('s+', 文本)  

# 要么

>>> 正则表达式.split(文本)

输出:['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']

一般来说,两种方法都可以使用。 但实际上使用正则表达式比多次使用函数要容易得多。 重新分裂.

使用三个函数查找匹配项

假设我们只需要从字符串中提取数字。 为此需要做些什么?

重新findall()

这是该功能的用例 找到所有(),它与正则表达式一起,允许您从文本变量中提取一个或多个数字的出现。

>>> 打印(文本)  

100 INF 信息学

213 MAT数学  

156 ENG 英语

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(文本)  

['100', '213', '156']

与 d 符号一起,我们使用了一个模板,该模板绝对指示位于变量或文本中的任何数值。 由于我们在那里添加了一个 +,这意味着必须至少存在一个数字。 

您还可以使用 * 符号来指定不需要数字就可以找到匹配项。

但在我们的例子中,由于我们使用了 +,我们提取了 找到所有() 文本中的 1 个或多个数字课程名称。 因此,在我们的例子中,正则表达式充当函数的设置。

re.search() 对比 重新匹配()

正如您可以从函数的名称中猜到的那样,第一个在文本中搜索匹配项。 问:有什么区别 找到所有? 关键是它返回一个与模式匹配的特定对象,而不是像前面的函数那样以列表的形式返回整个找到的结果序列。

反过来, re.match 函数也是如此。 只是语法不同。 模板必须放在开头。 

让我们举一个例子来说明这一点。

>>> # 创建一个带文本的变量

>>> text2 = «»»INF 信息学

213 MAT数学156″»»  

>>> # 编译正则表达式并寻找模式

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('第一个索引:', s.start())  

>>> print('最后一个索引:', s.end())  

>>> 打印(文本 2[s.start():s.end()]) 

第一指数:17 

最后指数:20

213

如果您想以不同的方式获得类似的结果,可以使用该功能 团体().

用 Re 库替换部分文本

要替换文本,请使用函数 re.sub()。 假设我们的课程列表发生了一些变化。 我们看到,在每个数字值之后,我们都有一个选项卡。 我们的任务是将所有这些序列组合成一行。 为此,我们需要替换表达式 s+ 通过 

原文是:

# 创建一个带文本的变量

>>> text = “””100 INF t 信息学

213 MAT 数学  

156 ENG t 英语»»»  

>>> 打印(文本)  

100信息 信息学

213马特 数学  

156埃昂 英语

为了执行所需的操作,我们使用了以下代码行。

# 用 1 替换一个或多个空格

>>> 正则表达式 = re.compile('s+')  

>>> print(regex.sub(' ', text))  

结果,我们有一条线。 

101 COM 计算机 205 MAT 数学 189 ENG 英语

现在考虑另一个问题。 我们没有面临放置空间的任务。 对我们来说更重要的是所有课程名称都以新行开头。 为此,使用另一个表达式,向异常添加换行符。 这是什么表情?

自学资料库 Re 支持负匹配等功能。 它与直接的不同之处在于它在斜线之前包含一个感叹号。 也就是说,如果我们需要跳过换行符,那么我们需要写 !n 而不是 n。

我们得到以下代码。

# 删除除换行符以外的所有空格  

>>> 正则表达式 = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', text))  

100 INF 信息学

213 MAT数学  

156 ENG 英语

什么是正则表达式组?

借助正则表达式组,我们可以以单独元素的形式获得所需的对象,而不是一行。 

假设我们需要获取课程编号、代码和名称,而不是在一行中,而是作为单独的元素。 要完成任务,您将需要编写大量不必要的代码行。 

事实上,任务可以大大简化。 您可以为所有条目编译模板,只需指定需要从括号中获取的数据。

会有非常少的行数。 

# 创建课程文本模板组并提取它们

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(课程模式,文本)  

[('100', 'INF', '计算机科学'), ('213', 'MAT', '数学'), ('156', 'ENG', 'English')]

“贪婪”匹配的概念

按照标准,正则表达式被编程为提取最大数量的匹配数据。 即使你需要的更少。

让我们看一个示例 HTML 代码,我们需要在其中获取标签。

>>> text = “贪婪正则表达式匹配示例”  

>>> re.findall('', 文本)  

['贪婪正则表达式匹配示例']

Python 没有只提取一个标签,而是得到了整个字符串。 这就是为什么它被称为贪婪。

怎么做才能只得到标签? 在这种情况下,您需要使用惰性匹配。 要指定这样的表达式,请在模式的末尾添加一个问号。

您将获得以下代码和解释器的输出。

>>> re.findall('', 文本)  

[,”]

如果只需要获取第一次遇到的事件,则使用该方法 搜索 ().

re.search('', text).group()  

=

然后只会找到开始标签。

流行的表达模板

这是一个包含最常用的正则表达式模式的表。

用于 Python 3 的 Re 模块的文档,位于 . 正则表达式的 Re 模块

结论

我们只考虑了使用正则表达式的最基本方法。 无论如何,您已经看到了它们的重要性。 在这里,是否需要解析整个文本或其单个片段,是否需要分析社交网络上的帖子或收集数据以便以后处理都没有区别。 正则表达式是这方面的可靠帮手。

它们允许您执行以下任务:

  1. 指定数据的格式,例如电子邮件地址或电话号码。
  2. 获取一个字符串并将其拆分为几个较小的字符串。
  3. 对文本执行各种操作,例如搜索、提取必要的信息或替换部分字符。

正则表达式还允许您执行重要的操作。 乍一看,掌握这门科学并不容易。 但在实践中,一切都是标准化的,所以弄清楚一次就足够了,之后这个工具不仅可以在 Python 中使用,还可以在任何其他编程语言中使用。 甚至 Excel 也使用正则表达式来自动处理数据。 所以不使用这个工具是一种罪过。

发表评论