无名、有名分组

(1)正则表达式—无名分组

从正则表 达式的左边开始看,看到的第一个左括号“(”表示表示第一个分组,第二个表示第二个分组, 依次类推。正则表达式

须要注意的是,有一个隐含的全局分组(就是索引号为0的分组),就是整个正则 表达式匹配的结果缓存

(2)正则表达式—有名分组

命名分组就是给具体有默认分组编号的组另外再起一个别名,方便之后的引用。 命令分组的语法格式以下: (?P正则表达式)索引

语法格式中的字符P必须是大写的“P”,name是一个合法的标识符,表示分组的别名。ip

s = "ip='230.192.168.78',version='1.0.0'"字符串

res = re.search(r"ip='(?P\d+\.\d+\.\d+\.\d+).*", s)io

print res.group('ip')#经过命名分组引用分组ast

正则表达式—后向引用

当用“()”定义了一个正则表达式分组后,正则引擎就会把匹配的组按照顺序进行编号,而后存 入缓存中。这样咱们就能够在后面对已经匹配过的内容进行引用,这就叫后向引用。import

(1)经过索引引用

\数字 \1表示引用第一个分组,\2引用第二个分组,以此类推,\n引用第n个组,而\0则表示引用整个 被匹配的正则表达式自己。module

交换字符串的位置object

import re

s = 'abc.xyz' # 交换.号两边的字符串

res = re.sub(r'(.*)\.(.*)', r'\2.\1', s)

print res

>>>xyz.abc

(2) (?P=name)经过命名分组名进行引用

(?P=name) 字符P必须是大写的P,name表示命名分组的分组名

(?P)(?P=name) 引用分组的值匹配值必须与第一个分组匹配值相等才能匹配到

例如:

1)    引用前一个分组,先后值相同都是2,故能匹配到

>>> re.match(r'(?P\d)(?P=xst)','22').groups()

('2',)

>>> re.match(r'(?P\d)(?P=xst)','22').group()

'22'

2)    引用前一个分组,先后值不相同分别为2和3,故不能匹配到

>>> re.match(r'(?P\d)(?P=xst)','23').group()

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'NoneType' object has no attribute 'group'

正则表达式—先后向断言

(1)前向确定断言与后向确定断言

1)    前向确定断言的语法:

(?<=pattern) 前向确定断言表示你但愿匹配的字符串前面是pattern匹配的内容时,才匹配。

2)    后向确定断言的语法:

(?=pattern) 后向确定断言表示你但愿匹配的字符串的后面是pattern匹配的内容时,才匹配

3)先后向断言同时使用

若是在一次匹配过程当中,须要同时用到前向确定断言和后向确定断 言时,那你必须将前向确定断言表达式写在要匹配的正则表达式的前面,然后向确定断言表 达式写在你要匹配的字符串的后面

(2) 前向否认断言与后向否认断言

1) 前向否认断言的语法:

(?

2) 后向否认断言的语法:

(?!pattern) 后向否认断言表示你但愿匹配的字符串后面不是pattern匹配的内容时,才匹配。

(3)注意

前向确定(否认)断言括号中的正则表达式必须是能肯定长度的正则表达式,好比\w{3},而不能写成 \w*或者\w+或者\w?等这种不能肯定个数的正则模式符。