Python 正则表达式 r‘(.*) are (.*?) .*‘的理解

        在学习Python3的正则表达式的时候遇到一个例子

#!/usr/bin/python3
import re
 
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

运行结果为

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

这个例子主要的理解为r‘(.*) are (.*?) .*’,以下为我查询资料之后所得到的个人理解以及试验

  1. 前面的r比较好理解,表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个例子中字符串里没有反斜杠,所以这个r可有可无。

  2. (.*) 第一个匹配分组,.*代表匹配除换行符之外的所有字符

  3. (.*?)第二个匹配分组,.*?后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符

  4. 后面的一个.*  没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。

综上所属以一种通俗易懂的描述就是将字符串以are为中断分为几部分,(.*)因为是贪婪的,所以返回的是所有满足条件的内容太,(.*?)为非贪婪模式,所以返回第一个满足要求的内容或没有

匹配成功,这句话如果不好理解就看看下面这个例子

  1 #!/usr/bin/python3
  2 
  3 import re
  4  
  5 #line = "Cats are smarter than dogs"
  6 line = "a a Cats are Cats are smarter than dogs"
  7 # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
  8 # (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
  9 matchObj = re.match( r'(.*) are (.*) .*', line, re.M|re.I)
 10  
 11 if matchObj:
 12     print ("matchObj.group() : ", matchObj.group())
 13     print ("matchObj.group(1) : ", matchObj.group(1))
 14     print ("matchObj.group(2) : ", matchObj.group(2))
 15 else:                                                                      
 16     print ("No match!!")

输出结果:

matchObj.group() :  a a Cats are Cats are smarter than dogs
matchObj.group(1) :  a a Cats are Cats
matchObj.group(2) :  smarter than

这个例子主要是将第一个例子中的line字符串进行了观察输出结果

group(1)对应第一个括号的条件,我理解为最后满足are分段的前面的所有内容,如果将第一个括号改为(.*?)就是第一个are的前面内容,经过验证确实是这样的,这里就不贴程序了可以自行验证

以下示例为更好的解释第二个括号的内容以及无括号的.*

1 #!/usr/bin/python3
  2 
  3 import re
  4  
  5 #line = "Cats are smarter than dogs"
  6 line = "a a Cats are Cats are smarter than dogs"
  7 # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
  8 # (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
  9 matchObj = re.match( r'(.*?) are (.*) .* .*', line, re.M|re.I)             
 10  
 11 if matchObj:
 12     print ("matchObj.group() : ", matchObj.group())
 13     print ("matchObj.group(1) : ", matchObj.group(1))
 14     print ("matchObj.group(2) : ", matchObj.group(2))
 15 else:
 16     print ("No match!!")
matchObj.group() :  a a Cats are Cats are smarter than dogs
matchObj.group(1) :  a a Cats
matchObj.group(2) :  Cats are smarter

group(2)对应第二个括号的条件:因为我将这里第一个括号的内容添加了?所以第一个括号索引的内容就是第一个are前面的内容,第二个括号就在当前这个are之后开始索引,在这里我没有加不加? 所以输出为输出后面出去.*条件的所有内容

.*因为没有()所以不能使用group访问,但是会实际占用位置,上面例子最后使用了两个.* 所以最后占用两个单词,那么前面的内容就是group(2)的输出内容了

可以自己尝试一个多加几个 are在语句中 然后判断语句修改有无?或者括号进行观察效果

  1 #!/usr/bin/python3
  2 
  3 import re
  4 
  5 #line = "Cats are smarter than dogs"
  6 line = "a a Cats are CatsB are smarter are than are dogs are dogs b c d e"
  7 # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
  8 # (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
  9 matchObj = re.match( r'(.*?) are (.*?) (.*?) (.*) .*', line, re.M|re.I)    
 10  
 11 if matchObj:
 12     print ("matchObj.group() : ", matchObj.group())
 13     print ("matchObj.group(1) : ", matchObj.group(1))
 14     print ("matchObj.group(2) : ", matchObj.group(2))
 15     print ("matchObj.group(3) : ", matchObj.group(3))
 16     print ("matchObj.group(4) : ", matchObj.group(4))
 17 else:
 18     print ("No match!!")
matchObj.group() :  a a Cats are CatsB are smarter are than are dogs are dogs b c d e
matchObj.group(1) :  a a Cats
matchObj.group(2) :  CatsB
matchObj.group(3) :  are
matchObj.group(4) :  smarter are than are dogs are dogs b c d

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值