
要用Python中的正则表达式匹配两个字符串/图案之间的任何文本,你可以使用。
re.search(r'pattern1(.*?)pattern2', s).group(1)
在接下来的章节中,你将看到如何通过一个简单的例子来应用上述方法。
在这个例子中,我们使用的是一个Kaggle数据集。如果你想了解更多关于如何将Kaggle读成Pandas DataFrame的信息,请查看这篇文章。如何搜索和下载Kaggle数据集为Pandas DataFrame
第一步:在两个字符串之间匹配文本
从一个简单的例子开始,让我们来看看下一个文本。
步骤1 一些文本 步骤2 更多的文本 步骤3 然后更多的文本
我们想提取step 1 和step 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个独立的字符串。
['一些文本','更多文本','然后更多文本']
