分组

你常常须要获得比 RE 是否匹配还要多的信息。正则表达式经常用来分析字符串,编写一个 RE 匹配感兴趣的部分并将其分红几个小组。举个例子,一个 RFC-822 的头部用 ":" 隔成一个头部名和一个值,这就能够经过编写一个正则表达式匹配整个头部,用一组匹配头部名,另外一组匹配头部值的方式来处理。python

组是经过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有不少在数学表达式中相同的意思;它们一块儿把在它们里面的表达式组成一组。举个例子,你能够用重复限制符,象 *, +, ?, 和 {m,n},来重复组里的内容,好比说(ab)* 将匹配零或更多个重复的 "ab"。正则表达式

#!python
>>> p = re.compile('(ab)*')
>>> print p.match('ababababab').span()
(0, 10)

组用 "(" 和 ")" 来指定,而且获得它们匹配文本的开始和结尾索引;这就能够经过一个参数用 group()、start()、end() 和 span() 来进行检索。组是从 0 开始计数的。组 0 老是存在;它就是整个 RE,因此 MatchObject 的方法都把组 0 做为它们缺省的参数。稍后咱们将看到怎样表达不能获得它们所匹配文本的 span。spring

#!python
>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'

小组是从左向右计数的,从1开始。组能够被嵌套。计数的数值能够经过从左到右计算打开的括号数来肯定。spa

#!python
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'

group() 能够一次输入多个组号,在这种状况下它将返回一个包含那些组所对应值的元组。code

#!python
>>> m.group(2,1,2)
('b', 'abc', 'b')

The groups() 方法返回一个包含全部小组字符串的元组,从 1 到 所含的小组号。索引

#!python
>>> m.groups()
('abc', 'b')

模式中的逆向引用容许你指定先前捕获组的内容,该组也必须在字符串当前位置被找到。举个例子,若是组 1 的内容可以在当前位置找到的话,\1 就成功不然失败。记住 Python 字符串也是用反斜杠加数据来容许字符串中包含任意字符的,因此当在 RE 中使用逆向引用时确保使用 raw 字符串。字符串

例如,下面的 RE 在一个字符串中找到成双的词。数学

#!python
>>> p = re.compile(r'(\b\w+)\s+\1')
>>> p.search('Paris in the the spring').group()
'the the'
相关文章
相关标签/搜索