阿布云

你所需要的,不仅仅是一个好用的代理。

七个正则表达式的使用(二)

阿布云 发表于

p1.png

4. 使用 re.findall – 所有匹配对象

目前为止在Python中我使用的最多的查找方法是findall()方法.当我们调用findall()方法,我们可以非常简单的得到一个所有匹配模式的列表,而不是得到match的对象(我们会在接下来更多的讨论match对象).对我而言这更加简单.对示例字符串调用findall()方法我们得到:

1.png

5. 使用 match.start 和 match.end 方法

那么,先前search()和match()方法先前返回给我们的‘match’对象”到底是什么呢?

和只简单的返回字符串的匹配部分不同,search()和match()返回的“匹配对象”,实际上是一个关于匹配子串的包装类.

先前你看到我可以通过调用group()方法得到匹配的子串,(我们将在下一个部分看到,事实上匹配对象在处理分组问题时非常有用),但是匹配对象还包含了更多关于匹配子串的信息.

例如,match对象可以告诉我们匹配的内容在原始字符串中的开始和结束位置:

2.png

知道这些信息有时候非常有用.

6. 使用 mathch.group 通过数字分组

就像我之前提到的,匹配对象在处理分组时非常得心应手.

分组是对整个正则表达式的特定子串进行定位的能力.我们可以定义一个分组做为整个正则表达式的一部分,然后单独的对这部分对应匹配到的内容定位.

让我们来看一下它是怎么工作的:

3.png

我刚才创建的字符串类似一个从某人的地址本里取出来的一个片段.我们可以通过这样一个正则表达式来匹配这一行:

4.png

通过用圆括号来(字符‘(’和‘)’)包围正则表达式的特定部分,我们可以对内容进行分组然后对这些子组做单独处理.

5.png

这些分组可以通过用分组对象的group()方法得到.它们可以通过其在正则表达式中从左到右出现的数字顺序来定位(从1开始):

6.png

组的序数从1开始的原因是因为第0个组被预留来存放所有匹配对象(我们在之前学习match()方法和search()方法到时候看到过).

7.png

7. 使用 match.group 通过别名来分组

有时候,特别是当一个正则表达式有很多分组的时候,通过组的出现次序来定位就会变的不现实.Python还允许你通过下面的语句来指定一个组名:

8.png

我们还是可以用group()方法获取分组的内容,但这时候我们要用我们所指定的组名而不是之前所使用的组的所在位数.

9.png

这大大加强了代码的明确性和可读性.你可以想像当正则表达式变得越来越复杂,去弄懂一个分组到捕获了什么内容将会变得越来越困难.给你的分组命名将明确的告诉了你和你的读者你的意图.

尽管findall()方法不返回分组对象,它也可以使用分组.类似的,findall()方法将返回一个元组的集合,其中每个元组中的第N个元素对应了正则表达式中的第N个分组.

10.png

但是,给分组命名并不适用于findall()方法.

在本文中我们介绍了Python中使用正则表达式的一些基础.我们学习了原始字符串类型(还有它能帮你解决的在使用正则表达式中一些头痛的问题).我们还学习了如何适使用match(), search(), and findall()方法进行基本的查询,以及如何使用分组来处理匹配对象的子组件.

和往常一样,如果想查看更多关于这个主题的内容,re模块的Python官方文档是一个非常好的资源.