Python正则表达式解答
小编写这篇文章的一个主要目的,主要是给大家去做一个解答,解答的内容是关于Python正则表达式的内容,主要是会涉及到r'(.*)are(.*?)\s.*’这些相关的知识性内容,它也是比较的晦涩难懂的,下面给大家具体解释下。

Python3的正则表达式
在学习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
matchObj.group(2): are smarter than dogs
group(1)对应第一个括号的条件,我理解为最后满足are分段的前面的所有内容,如果将第一个括号改为(.*?)就是第一个are的前面内容,经过验证确实是这样的,这里就不贴程序了可以自行验证。
group(2)对应第二个括号的条件:因为我将这里第一个括号的内容添加了?所以第一个括号索引的内容就是第一个are前面的内容,第二个括号就在当前这个are之后开始索引,在这里我没有加不加?所以输出为输出后面出去.*条件的所有内容。
可以自己尝试一个多加几个are在语句中然后判断语句修改有无?或者括号进行观察效果。
到此为止,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/7219.html
