亲宝软件园·资讯

展开

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

linng12 人气:0

在学习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为中断分为几部分,(.*)因为是贪婪的,所以返回的是所有满足条件的内容太,(.*?)为非贪婪模式,所以返回第一个满足要求的内容或没有

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

  #!/usr/bin/python3
  
  import re
   
  #line = "Cats are smarter than dogs"
  line = "a a Cats are 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() :  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的前面内容,经过验证确实是这样的,这里就不贴程序了可以自行验证

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

 #!/usr/bin/python3
  
  import re
   
  #line = "Cats are smarter than dogs"
  line = "a a Cats are 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() :  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在语句中 然后判断语句修改有无?或者括号进行观察效果

  #!/usr/bin/python3
  
  import re
  
  #line = "Cats are smarter than dogs"
  line = "a a Cats are CatsB are smarter are than are dogs are dogs b c d e"
  # .* 表示任意匹配除换行符(\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))
      print ("matchObj.group(3) : ", matchObj.group(3))
      print ("matchObj.group(4) : ", matchObj.group(4))
  else:
      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

总结

加载全部内容

相关教程
猜你喜欢
用户评论