如何在Python中用正则表达式(regex)匹配两个字符串之间的文本-教程

324 阅读3分钟

How to Match text between two strings with regex in Python

要用Python中的正则表达式匹配两个字符串/图案之间的任何文本,你可以使用。

re.search(r'pattern1(.*?)pattern2', s).group(1)

在接下来的章节中,你将看到如何通过一个简单的例子来应用上述方法。

在这个例子中,我们使用的是一个Kaggle数据集。如果你想了解更多关于如何将Kaggle读成Pandas DataFrame的信息,请查看这篇文章。如何搜索和下载Kaggle数据集为Pandas DataFrame

第一步:在两个字符串之间匹配文本

从一个简单的例子开始,让我们来看看下一个文本。

步骤1 一些文本 步骤2 更多的文本 步骤3 然后更多的文本

我们想提取step 1step 2 之间的所有内容。要做到这一点,我们将使用捕获组,如。

import re
s = 'step 1 some text step 2 more text step 3 then more text'
re.search(r'step 1(.*?)step 2', s).group(1)

结果。

' some text '

它是如何工作的。

  • step 1 - 匹配步骤1中的字符(区分大小写)。
  • (.*?) - 匹配零到无限次之间的任何字符,根据需要扩展(懒惰)。
  • step 2 - 匹配步骤2中的字符(区分大小写)。

非懒惰搜索

前面的例子会停下来,直到找到满足它的文本。如果你喜欢提取。

some text step 2 more text

那么你需要将搜索改为。

re.findall(r'step \d (.*) step \d', s)

第2步:在两个模式之间匹配文本

现在我们假设你想匹配一个模式而不是固定的文本。在这个例子中,我们将看到如何提取step ,后面是一个数字。

import re
s = 'step 1 some text\nstep 2 more text\nstep 3 then more text\nconclusion'
re.findall(r'(?:step \d)(.*?)(?:\n)', s)

所以有了下一个文本。

step 1 some text
step 2 more text
step 3 then more text
conclusion

我们将提取。

[' some text', ' more text', ' then more text']

它是如何工作的?

  • (?:step \d) - 非捕获组 -?: - 它将被匹配但不被提取
    • step \d - 匹配字面上的字符步骤(区分大小写),后面是一个数字(相当于[0-9])。
  • (.*?) - 第一捕获组 - 捕获任何东西的懒惰模式
  • (?:\n) - 非抓取组
    • \n 匹配一个换行符

第3步:在两个模式之间匹配文本 懒惰与贪婪

在这一步,我们将对懒惰与贪婪的匹配进行更多的解释。其区别可以解释为:。

  • @(.*?)@ -懒惰
  • @(.*)@ -贪婪

因此,假设我们有一个邮件列表,比如说。

|firstmail@some.som; |secondmail@some.som; |somemail@some.som

如果我们在字符串之间做一个贪婪的提取,我们将得到。

s = "|firstmail@some.som; |secondmail@some.som;|somemail@some.som;"
re.findall(r'\|(.*);', s)

结果是,从第一个| 到最后一个; ,只有一个匹配。

['firstmail@some.som;|secondmail@some.som;|somemail@some.som']

而如果我们在两个子串之间做一个懒人搜索,那么我们将得到

s = 'step 1 some text\nstep 2 more text\nstep 3 then more text\nconclusion'
re.findall(r'(?:step \d)(.*?)(?:\n)', s)

3个独立的字符串。

['一些文本','更多文本','然后更多文本']

How to Match text between two strings with regex in Python