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

作者:linng12 时间:2022-02-28 09:40:48 

在学习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

来源:https://blog.csdn.net/linng12/article/details/121614878

标签:python,正则表达式,r‘(.,),are,(.,?),.,‘
0
投稿

猜你喜欢

  • 在PyCharm下使用 ipython 交互式编程的方法

    2021-05-06 11:12:01
  • PostgreSQL基础知识之SQL操作符实践指南

    2024-01-19 18:31:34
  • python smtplib发送带附件邮件小程序

    2023-03-24 17:14:26
  • JavaScript实现简单MD5加密的脚本分享

    2023-07-02 03:47:49
  • Python处理CSV与List的转换方法

    2021-11-22 11:53:48
  • 关于SQL Server数据库备份和恢复特性介绍

    2009-02-19 16:57:00
  • sql server性能调优 I/O开销的深入解析

    2024-01-19 05:17:57
  • 基于python及pytorch中乘法的使用详解

    2022-08-07 09:26:59
  • anaconda的安装和配置环境及导入pycharm的方法

    2022-12-08 12:58:23
  • 快速解决Golang Map 并发读写安全的问题

    2024-04-30 10:03:46
  • node.js回调函数之阻塞调用与非阻塞调用

    2024-05-05 09:21:26
  • Div即父容器不根据内容自适应高度的解决方法

    2010-04-23 18:19:00
  • PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT

    2023-09-08 08:07:37
  • 用python实现前向分词最大匹配算法的示例代码

    2023-12-03 00:18:46
  • 基于vue的验证码组件的示例代码

    2024-06-05 15:29:22
  • python3启动web服务引发的一系列问题汇总

    2022-10-31 09:11:58
  • PHP对战ASP:这还值得讨论吗

    2008-04-16 14:19:00
  • 五个小窍门帮你写出更好的CSS代码

    2009-06-09 12:42:00
  • PHP字符串的编码问题的详细介绍

    2024-05-02 17:17:15
  • Python常用编译器原理及特点解析

    2021-09-04 05:10:11
  • asp之家 网络编程 m.aspxhome.com