分组 2018/12/20


 

组的基础:


 
1) \'(\'\')\' 组是由一对圆括号括起来的正则式。
2) findall 返回包含在 \'()\' 中内容,前和后面内容都匹配成功,却并不包含在结果中。
3) 子组从左到右从1向上编号可嵌套; 要确定数字,只需计算左括号的左括号字符。 

 

实例:

 


 
# 实例1:无命名组
s = \'aaa111aaa , bbb222 , 333ccc \'#匹配包夹在字母中间的数字
re.findall (r\'[a-z]+(\\d+)[a-z]+\' , s ) # [\'111\']

s=\'aaa111aaa,bbb222,333ccc,444ddd444,555eee666,fff777ggg\'
re.findall( r\'([a-z]+)\\d+([a-z]+)\' , s ) # 找出中间夹有数字的字母 # [(\'aaa\', \'aaa\'), (\'fff\', \'ggg\')]
re.findall( r\'[a-z]+(\\d+)([a-z]+)\' , s ) # 找出中间是数字后面是字母# [(\'111\', \'aaa\'), (\'777\', \'ggg\')]

# 实例2:命名组
m = re.search(r\'(?P<word>\\b\\w+\\b)\', \'(((( Lots of punctuation )))\' )
m.group(\'word\')# \'Lots\'
m.group(1) # \'Lots\'

# 实例3:非捕获
re.match(\"([abc])+\", \"abc\").groups() # (\'c\',)
re.match(\"(?:[abc])+\", \"abc\").groups() # 非捕获组无法检索组匹配内容 # ()

s = \'I have a dog , I have a cat\'
re.findall( r\'I have a (?:dog|cat)\' , s )# [\'I have a dog\', \'I have a cat\']
re.findall( r\'I have a dog|cat\' , s ) # [\'I have a dog\', \'cat\']  将 \'I have a dog\' 和 \'cat\' 当成两个规则

# 实例4:反向引用-字符串替换时非常有用
p = re.compile(r\'\\b(\\w+)\\s+\\1\\b\') #RE检测字符串中的双字
p = re.compile(r\'\\b(?P<word>\\w+)\\s+(?P=word)\\b\') #等价
p.search(\'Paris in the the spring\').group() # \'the the\'

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

# 实例5:条件匹配
# \'(?( id\\name )yes-pattern|no-pattern)\' 判断指定组是否已匹配,执行相应的规则
# 如id\\name 指定组在前面匹配成功执行 yes-pattern 否则执行 no-pattern 的正则式。

# 要匹配形如 usr@mail  < usr@mail > 
s=\'<usr1@mail1>  usr2@maill2\'
re.findall( r\'\\s*(\\w+@\\w+)\\s*\' , s ) #一般匹配#[\'usr1@mail1\', \'usr2@maill2\']
re.findall( r\'(<)?\\s*(\\w+@\\w+)\\s*(?(1)>)\' , s )# [(\'<\', \'usr1@mail1\'), (\'\', \'usr2@maill2\' )] 

 

实例6:

 


 
match = re.match( r\'(.*) are (.*?) .*\',\"Cats are smarter than dogs\", re.M|re.I)
# (.*) 第1个匹配分组,匹配除换行符之外所有字符
# (.*?) 第2个匹配分组,.? 非贪婪模式
# .* 不是分组,匹配效果同第1个,不计入匹配结果中

if match:
print( \"group(all)= : \", match.group()) #匹配到的完整文本字符
print(\"group(1)= \", match.group(1)) #得到第一组匹配结果,也就是(.*)匹配到
print(\"group(2)= \", match.group(2)) #得到第二组匹配结果,也就是(.*?)匹配到的
else:
print(\"No match!\")

# group(all)= : Cats are smarter than dogs
# group(1)= Cats
# group(2)= smarter 

 

可以通过:


 

可以通过:


 

 

可以通过:


 

 

收藏 打印