python正则表达式系列(4)——分组和后向引用

原创 2017年04月27日 08:03:14

分组,即分组匹配,也称为捕获组,是正则中的一种比较重要的匹配方式。此外后向引用和分组相结合,可以写出很多复杂匹配场景的正则。

1. 分组

分组的方法:将子表达式用小括号括起来,如:(exp),表示匹配表达式exp,并捕获文本到自动命名的组里。举例:

import re
s = 'c1c b2b c3c'
p = re.compile(r'c(\d)c')
print '【Output】'
print re.findall(p,s)
【Output】
['1', '3']
s = 'age:13,name:Tom;age:18,name:John'
p = re.compile(r'age:(\d+),name:(\w+)')
it = re.finditer(p,s)
print '【Output】'
for m in it:
    print '------'
    print m.group()
    print m.group(0)
    print m.group(1)
    print m.group(2)
【Output】
------
age:13,name:Tom
age:13,name:Tom
13
Tom
------
age:18,name:John
age:18,name:John
18
John

2. 忽略某个分组

有时候给正则的某个子表达式加括号并不是为了分组,而仅仅是为了看起来更清晰,因此在匹配结果中并不想匹配该子表达式,那么该怎么办呢?答案是忽略该分组,方法:(?:exp)。举例:只想匹配name,不想匹配age:

s = 'age:13,name:Tom'
p1 = re.compile(r'age:(\d+),name:(\w+)')
print '【Output】'
# 不忽略分组
print re.findall(p1,s)

# 忽略分组
p2 = re.compile(r'age:(?:\d+),name:(\w+)')
print re.findall(p2,s)
【Output】
[('13', 'Tom')]
['Tom']

3. 后向引用

所谓后向引用,就是对前面出现过的分组再一次引用,使用默认的分组名称进行后向引用:\1,\2,\3…

举例:

# 匹配字符串中连续出现的两个相同的单词
s = 'hello blue go go hello'
p = re.compile(r'\b(\w+)\b\s+\1\b')  # 这里的'\1'就对应前面的(\w+)
print '【Output】'
print re.findall(p,s)
【Output】
['go']

4. 自定义名称分组的后向引用

python正则可以对分组自定义名称,然后可以使用自定义名称进行后向引用,使用自定义分组名称比使用默认分组名称更加清晰、更容易让人理解。对分组自定义名称的方法:

(?P<myname>exp)

后向引用的方式:

(?P=myname)

这里要注意的是,其他语言的正则与python正则的分组自定义名称的语法不太一样,其他语言是这样写的:

# 自定义名称
(?<name>exp)
# 后向引用
\K<name>

举个例子:

s = 'hello blue go go hello'
p = re.compile(r'\b(?P<my_group1>\w+)\b\s+(?P=my_group1)\b')
print '【Output】'
print re.findall(p,s)
【Output】
['go']

5. 后向引用的应用

1. 匹配”ABAB”型字符串

s = 'abab cdcd efek'
p = re.compile(r'(\w\w)\1')
print '【Output】'
print re.findall(p,s)
【Output】
['ab', 'cd']

2. 匹配”AABB”型字符串

s = 'abab cdcd xxyy'
p = re.compile(r'(\w)\1(\w)\2')
print '【Output】'
print re.findall(p,s)
【Output】
[('x', 'y')]

3. 匹配”AABA”型字符串

s = 'abab cdcd xxyx'
p = re.compile(r'(\w)\1(?:\w)\1')
print '【Output】'
print re.findall(p,s)
【Output】
['x']

4. 匹配”ABBA”型字符串

s = 'abab toot'
p = re.compile(r'(\w)(\w)\2\1')
print '【Output】'
print re.findall(p,s)
【Output】
[('t', 'o')]

5. 向字符串中的某些位置插入字符

有一个需求:在一个字符串中的所有通配符(% _ [ ])前都加上”\”符进行转义,如果通配符前面本来就有”\”,则不再插入。举例:

s = 'abc\\_de%fgh[c][]c'
special = r'[%_\[\]]'
print '【Output】'
print 's = {0}'.format(s)
print re.sub(r'([^\\])(?=%s)' % special,r'\1\\',s)
# 注:这里的"(?=%s)"是零宽断言,匹配一个位置,零宽断言在后面会讲
【Output】
s = abc\_de%fgh[c][]c
abc\_de\%fgh\[c\]\[\]c

6. 在字符串中从后往前每隔3个字符插入一个”,”符号

s = '1234567890'
s = s[::-1]
print '【Output】'
print s
s = re.sub(r'(...)',r'\1,',s)
print s[::-1]
【Output】
0987654321
1,234,567,890
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Python 正则表达式(分组)

正则表达式分组分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是...

Python正则表达式之: (…) group 分组

下面就来解释一下,Python中的(…)的含义和用法: 1.(…) 用来匹配符合条件的字符串。并且将此部分,打包放在一起,看做成一个组,group。 2. 而此group,可以被后续的(正...

Python:re中的group方法简介

原文地址:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html。 正则表达式中,group()用来提出分组截...

python正则表达式中的分组 group

组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思;它们一起把在它们里面的表达式组成一组。举个例子,你可以用重复限制符,象 *, +, ?, 和 {m,...
  • caianye
  • caianye
  • 2011年10月24日 17:22
  • 24172

详解Python正则表达式之: (?P<name>…) named group 带命名的组

Python 2.7的手册中的解释: (?P...) Similar to regular parentheses, but the substring matched by the ...

正则表达式之分组捕获、条件表达式、平衡组

其实我是想说平衡组,但我并是想写一篇给零基础的朋友们阅读,我希望你是对正则有所了解,对平衡组不太了解的朋友阅读。如果已经了解,看看也无妨。多一点思路。   分组捕获 - () 就是用...

正则表达式 分组命名 替换

利用正则表达式分组替换信息: 源数据 :小明 13800138000 广东省 目的结果:广东省 13800138000 小明匹配:^(?.*)\t(?.*)\t(?.*)$替换:${...

正则表达式之分组(捕获)、后向引用

分组          正则表达式中的分组又称为子表达式,就是把一个正则表达式的全部或部分当做一个整体进行   处理,分成一个或多个组。其中分组是使用“()”表示的。进行分组之后“()”里面...
  • kiritor
  • kiritor
  • 2013年03月31日 11:48
  • 3542

Python正则表达式学习(2)——字符集 [] 与 分组(capture group) ()

字符集:分组(捕获组): 普通捕获组:(Expression) 命名捕获组:(?Expression)普通分组(普通捕获组): 编号规则: 如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要...

正则表达式学习记录-后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python正则表达式系列(4)——分组和后向引用
举报原因:
原因补充:

(最多只允许输入30个字)