分组 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
可以通过:
可以通过:
可以通过:
继续阅读与本文标签相同的文章
-
为什么它有典型FaaS能力,却是非典型FaaS架构? | 开发者必读(065期)
2026-05-18栏目: 教程
-
Mybatis执行SQL的4大基础组件详解
2026-05-18栏目: 教程
-
Java描述设计模式(08):桥接模式
2026-05-18栏目: 教程
-
Java描述设计模式(09):装饰模式
2026-05-18栏目: 教程
-
Java描述设计模式(10):组合模式
2026-05-18栏目: 教程
