正则.*?解析

关于 (.) are (.?) .解析:
‘.’用于匹配除换行符(\n)之外的所有字符。
‘^’用于匹配字符串的开始,即行首。
‘$’用于匹配字符串的末尾(末尾如果有换行符\n,就匹配\n前面的那个字符),即行尾。
’用于将前面的模式匹配0次或多次(贪婪模式,即尽可能多的匹配)
‘+’用于将前面的模式匹配1次或多次(贪婪模式)
‘?’用于将前面的模式匹配0次或1次(贪婪模式)
‘*?,+?,??’即上面三种特殊字符的非贪婪模式(尽可能少的匹配)。
‘{m,n}’用于将前面的模式匹配m次到n次(贪婪模式),即最小匹配m次,最大匹配n次。
‘{m,n}?’即上面‘{m,n}’的非贪婪版本。
‘\’:’'是转义字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含义,比如+就仅仅代表加号+本身。
‘[]’用于标示一组字符,如果是第一个字符,则标示的是一个补集。比如[0-9]表示所有的数字,[0-9]表示除了数字外的字符。
‘|’比如A|B用于匹配A或B。
‘(…)’用于匹配括号中的模式,可以在字符串中检索或匹配我们所需要的内容。

   #!/usr/bin/python
    import re
     
    line = "Cats are smarter than dogs";
     
    searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
     
    if searchObj:
       print "searchObj.group() : ", searchObj.group()
       print "searchObj.group(1) : ", searchObj.group(1)
       print "searchObj.group(2) : ", searchObj.group(2)
    else:
       print "Nothing found!!"

解析:

首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。

(.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。
(.?) 第二个匹配分组,.? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符

matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的

matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的

因为只有匹配结果中只有两组,所以如果填 3 时会报错。

猜你喜欢

转载自blog.csdn.net/qq_40397615/article/details/89078983