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 (.*?) .*’,以下为我查询资料之后所得到的个人理解以及试验
- 前面的r比较好理解,表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个例子中字符串里没有反斜杠,所以这个r可有可无。
- (.*) 第一个匹配分组,.*代表匹配除换行符之外的所有字符
- (.*?)第二个匹配分组,.*?后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
- 后面的一个.* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
综上所属以一种通俗易懂的描述就是将字符串以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
总结
加载全部内容