您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:Python正则表达式

51自学网 2022-07-22 18:48:36
  python
这篇教程Python正则表达式写得很实用,希望能帮到您。

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

#!/usr/bin/python3import 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

总结

到此这篇关于Python正则表达式 r‘(.*) are (.*?) .*‘的深入理解的文章就介绍到这了,更多相关Python正则表达式 r‘(.*) are (.*?) .*‘内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


使用python如何提取JSON数据指定内容
Python可视化神器pyecharts绘制漏斗图
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1