正则表达式视觉指南

2020-11-14 15:41:23

在NLP中,根据模式检查文本或从文本中提取与特定模式匹配的部分是一项常见任务。正则表达式或“regex”是实现这一目标的强大工具。

虽然功能强大,但regex可能会让人望而生畏,因为它有很多需要记住的特性和子部分。

在这篇文章中,我将说明正则表达式背后的各种概念。我们的目标是帮助您构建一个良好的心理模型,说明正则表达式模式是如何工作的。

让我们从一个简单的例子开始,在这个例子中,我们试图在文本中找到“酷”这个词。

使用正则表达式,我们只需键入单词‘Cool’作为模式,它就会与该单词匹配。

虽然正则表达式与我们想要的单词“酷”匹配,但它的操作方式不是在单词级别,而是在字符级别。这是关键的想法。

这意味着,正则表达式也会与下面的句子相匹配。

现在我们理解了关键思想,让我们了解如何使用正则表达式匹配简单字符。

我们只需在正则表达式中指定字符,它就会匹配文本中的所有实例。

例如,下面给出的正则表达式将匹配文本中‘a’的所有实例。你可以使用任何小写字母和大写字母。

您也可以使用0到9之间的任何数字,它也可以正常工作。

请注意,默认情况下,regex区分大小写,因此下面的regex将不匹配任何内容。

Regex提供了一组内置的特殊符号,可以一次匹配一组字符。这些字符以反斜杠\开头。

请注意,匹配项是个位数。因此,我们在下面有4个不同的匹配,而不是一个单独的数字18.04。

它可以匹配任何小写字母(a到z)、大写字母(A到Z)、数字(0到9)和下划线。

导入Re>;>;>;Re。Findall(第1行\n行2&39;)[';l';,';n';,';e';,';1';,';l';,';i';,';n';,';e';,';2';]

例如,如果“\d”匹配0到9之间的任何数字,则“\d”将匹配除“0到9”之外的任何数字。

这些模式以[开始,以]结束,并指定应该用方括号括起来的字符。

例如,以下模式匹配字符‘a’、‘e’、‘i’、‘o’和‘u’中的任何一个。

您还可以使用以下模式复制\d的功能。它将匹配0到9之间的任何数字。

我们可以使用-来仅指定开始和结束数字,而不是指定所有数字。因此,我们可以执行以下操作,而不是[0123456789]:

例如,[2-4]可用于匹配2到4之间的任何数字,即(2或3或4)。

您甚至可以使用我们之前在方括号内学到的特殊字符。例如,您可以将0到9之间的任意数字或空格匹配为:

Regex还有特殊的处理程序,使模式只在字符串的开头或结尾匹配。

我们只能在行首使用^锚点匹配模式。例如:

同样,只有在行尾时,我们才能在字符后面使用$锚来匹配模式。例如:

考虑一下我们想要精确匹配“Stark先生”这个词的情况。

如果我们像Stark先生那样编写正则表达式,那么它将产生意想不到的影响。因为我们知道点在正则表达式中有特殊的含义。

因此,如果我们的目标是精确匹配字符本身,那么我们应该始终避开特殊的元字符,如.、$等。

以下是直接使用元字符时应记住转义的元字符列表。

既然我们可以对任何字符进行模式匹配,我们就可以重复这些操作并开始构建更复杂的模式。

仅利用我们迄今所学的知识,一个天真的方法就是重复这种模式。例如,我们可以通过重复字符级模式来匹配两位数。

Regex提供了特殊的量词来为其前面的字符指定不同类型的重复。

我们可以使用{...}量词来指定模式应该重复的次数。

您还可以使用相同的量词指定重复范围。例如,要匹配从2位数到4位数的数字,我们可以使用以下模式:

注意:最小计数和最大计数之间不应有任何空格,例如,\d{2,4}不起作用。

Regex还提供量词“*”、“+”和“?”使用它可以指定字符的灵活重复。

0次或1次:?那个?如果重复0次或1次,则量词与前一个字符匹配。这对于使某些部件成为可选部件非常有用。它相当于{0,1}。

例如,假设我们希望同时匹配单词“声音”和“声音”,其中“s”是可选的。那么,我们可以使用?如果字符重复0次或1次,则匹配的限定符。

一次或多次:+如果+重复1次或多次,则+量词与前一个字符匹配。它相当于{1,}。

零次或多次:*如果*限定符重复零次或多次,则它与前一个字符匹配。相当于{0,}。

Python在标准库中提供了一个名为“Re”的模块来处理正则表达式。

要在Python中指定正则表达式,我们在其前面加上r以创建原始字符串。

为了理解为什么在r前面加上r,让我们试着打印不带**r**的表达式\t。

您可以看到,当我们不使用原始字符串时,字符串\t被Python视为Tab的转义字符。

现在让我们将其转换为原始字符串。我们会拿回我们指定的任何东西。

此函数用于搜索字符串开头的模式,并将第一个匹配项作为匹配对象返回。如果未找到该模式,则返回NONE。

在我们的模式不在句子开头的情况下,我们将不会得到任何匹配。

此函数还会查找模式的第一个匹配项,但该模式可以出现在文本中的任何位置。如果未找到该模式,则返回NONE。