python正则表达式

2026/1/16 8:40:25

‘(?P…)’ 命名组

?(?P?代表这是一个Python的语法扩展?<…>?里面是你给这个组起的名字,比如你可以给一个全部由数字组成的组叫做?num?,它的形式就是?(?P\\d+)?。起了名字之后,我们就可以在后面的正则式中通过名字调用这个组,它的形式是 ‘(?P=name)’ 调用已匹配的命名组

要注意,再次调用的这个组是已被匹配的组,也就是说它里面的内容是和前面命名组里的内容是一样的。

我们可以看更多的例子:请注意下面这个字符串各子串的特点。 >>> s='aaa111aaa,bbb222,333ccc,444ddd444,555eee666,fff777ggg' 我们看看下面的正则式会返回什么样的结果:

>>> re.findall( r'([a-z]+)\\d+([a-z]+)' , s ) # 找出中间夹有数字的字母 [('aaa', 'aaa'), ('fff', 'ggg')]

>>> re.findall( r '(?P[a-z]+)\\d+(?P=g1)' , s ) #找出被中间夹有数字的前后同样的字母 ['aaa']

>>> re.findall( r'[a-z]+(\\d+)([a-z]+)' , s ) #找出前面有字母引导,中间是数字,后面是字母的字符串中的中间的数字和后面的字母 [('111', 'aaa'), ('777', 'ggg')]

我们可以通过命名组的名字在后面调用已匹配的命名组,不过名字也不是必需的。 ‘\\number’ 通过序号调用已匹配的组

正则式中的每个组都有一个序号,序号是按组从左到右,从1开始的数字,你可以通过下面的形式来调用已匹配的组

比如上面找出被中间夹有数字的前后同样的字母的例子,也可以写成: >>> re.findall( r?([a-z]+)\\d+\\1? , s ) ['aaa']

结果是一样的。 我们再看一个例子

>>> s='111aaa222aaa111 , 333bbb444bb33'

>>> re.findall( r'(\\d+)([a-z]+)(\\d+)(\\2)(\\1)' , s ) #找出完全对称的 数字-字母-数字-字母-数字 中的数字和字母 [('111', 'aaa', '222', 'aaa', '111')]

Python2.4以后的re模块,还加入了一个新的条件匹配功能

‘(?(id/name)yes-pattern|no-pattern)’ 判断指定组是否已匹配,执行相应的规则

这个规则的含义是,如果id/name指定的组在前面匹配成功了,则执行yes-pattern的正则式,否则执行no-pattern的正则式。

举个例子,比如要匹配一些形如 usr@mail 的邮箱地址,不过有的写成< usr@mail >即用一对<>括起来,有点则没有,要匹配这两种情况,可以这样写 >>> s=' usr2@maill2'

>>> re.findall( r'(<)?\\s*(\\w+@\\w+)\\s*(?(1)>)' , s )

[('<', 'usr1@mail1'), ('', 'usr2@maill2')] 不过如果目标字符串如下

>>> s=' usr2@maill2 < usr5@mail5 ' 而你想得到要么由一对<>包围起来的一个邮件地址,要么得到一个没有被<>包围起来的地址,但不想得到一对<>中间包围的多个地址或不完整的<>中的地址,那么使用这个式子并不能得到你想要的结果 >>> re.findall( r'(<)?\\s*(\\w+@\\w+)\\s*(?(1)>)' , s )

[('<', 'usr1@mail1'), ('', 'usr2@maill2'), ('', 'usr3@mail3'), ('', 'usr4@mail4'), ('', 'usr5@mail5')]

它仍然找到了所有的邮件地址。

想要实现这个功能,单纯的使用findall有点吃力,需要使用其它的一些函数,比如match或search函数,再配合一些控制功能。这部分的内容将在下面详细讲解。

小结:以上基本上讲述了Python正则式的语法规则。虽然大部分语法规则看上去都很简单,可是稍不注意,仍然会得到与期望大相径庭的结果,所以要写好正则式,需要仔细的体会正则式规则的含义后不同规则之间细微的差别。 详细的了解了规则后,再配合后面就要介绍的功能函数,就能最大的发挥正则式的威力了。

第三章

2 re模块的基本函数

在上面的说明中,我们已经对re模块的基本函数 ?findall?很熟悉了。当然如果光有findall的话,很多功能是不能实现的。下面开始介绍一下re模块其它的常用基本函数。灵活搭配使用这些函数,才能充分发挥Python正则式的强大功能。 首先还是说下老熟人findall函数吧 findall(rule , target [,flag] )

在目标字符串中查找符合规则的字符串。

第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。

返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。 2.1 使用compile加速 compile( rule [,flag] )

将正则规则编译成一个Pattern对象,以供接下来使用。 第一个参数是规则式,第二个参数是规则选项。 返回一个Pattern对象

直接使用findall ( rule , target )的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,


python正则表达式.doc 将本文的Word文档下载到电脑
搜索更多关于: python正则表达式 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219