re模块中的非贪婪匹配

    python的re模块中有贪婪匹配和非贪婪匹配之分,当使用*时会匹配零个或多个,使用+时会匹配一个或多个.当使用?在前边特殊符号前时会进行非贪婪匹配,匹配零个或者一个,今天主要讨论非贪婪匹配中存在的坑.

import re

res = re.findall(‘a?‘,‘aaa‘)
print(res)

#[‘a‘, ‘a‘, ‘a‘, ‘‘]

res1 = re.findall(‘pa?‘,‘paaa‘)
print(res1)

#[‘pa‘]

res2 = re.findall(‘.?‘,‘aaaa‘)
print(res2)

#[‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘‘]

  从上边例子中可以看出,当带有‘?‘的部分单独处于正则开头并且后边没有其它匹配条件时,匹配结果会多匹配一次,所以在res和res2中会多匹配一个空格;而当‘?‘部分在正则的中间或者尾部时,则不会出现多一次的情况,所以在res1中结果是‘pa‘.此时有人会问为什么res会匹配出空格,而res1在没匹配到时候没有空格?看下边的例子:

import re

ret = re.findall(‘paa?‘,‘papaaa‘)
print(ret)
#[‘pa‘, ‘paa‘]

ret1 = re.findall(‘(paa)?‘,‘papaaa‘)
print(ret1)

#[‘‘, ‘‘, ‘paa‘, ‘‘, ‘‘]

ret2 = re.findall(‘a(?:paa)?‘,‘apapaaa‘)
print(ret2)

#[‘a‘, ‘apaa‘, ‘a‘]

  上边例子中可以看出,只有当正则表达式只有一个单独的分组或者元字符时,加上‘?‘如果匹配不到才会出现空格,而且在ret1中可以看出,多匹配了一次空格.当正则是一串字符时,匹配出的就没有空字符,所以ret结果为[‘pa‘, ‘paa‘].

  综上所述:当正则表达式中是以带‘?‘的部分开头并且没有其它匹配内容时,匹配不到会出现空字符,并且会多匹配一次;而当使用两个‘?‘时,结果肯定是匹配零个;如果正则是一个分组(即一个单独的整体时)才会匹配出空字符.

  

原文地址:https://www.cnblogs.com/wangtaobiu/p/10674229.html

时间: 2024-11-06 17:47:29

re模块中的非贪婪匹配的相关文章

shell 中 贪婪匹配 和 非贪婪匹配

举个栗子: v=jfedu.shiyiwen.com echo ${v%.*} 一个%为非贪婪匹配,即匹配最短结果.%从右到左进行非贪婪匹配,匹配什么呢? 匹配已 .*的字符. 那么当然是匹配到了.com 然后执行删除匹配到的字符.结果就是(这里的 "." 相当于定界符.而“*”是通配符) jfedu.shiyiwen echo ${v%%.*} 而这里执行贪婪匹配,即匹配最长结果就匹配到了 .shiyiwen.com 结果为 jfedu 这里在说一个 # 刚好和 %顺序相反而已,#是

简单聊一聊正则表达式中的贪婪匹配和非贪婪匹配

1. 贪婪匹配 在JS中利用正则表达式时,默认的匹配就是贪婪匹配,也就是尽可能多的去匹配,举个例子: var s = 'aaa'; var regexp = /a+/; // 匹配1个或多个a,贪婪匹配 console.log(regexp.exec(s)[0]); // 'aaa' 在上面的例子中,匹配到了 'aaa' . 2. 非贪婪匹配 我们同样可以进行非贪婪匹配只需要在正则表达式待匹配的字符后面加上一个 ? 即可. 还是上面的例子: var s = 'aaa'; var regexp =

python 贪婪 非贪婪 匹配

python re模块还是需要重新学习. python readline 和 readlines(), readline() , read() 三者之间的区别,以前一直都不清楚,现在搞清楚是怎么回事了. readlines() 可以一起显示出整个文件,这个也是迭代显示的,需要追行显示,迭代器的指针会被消耗的. python 中的正则是匹配换行以外的所有的字符..* 是匹配不了所有的字符的.在某些情况下,我的结论是正确的,但是在某些情况下,我的结论又是错误的.刚才遇到的问题,现在终于知道是怎么回事

正则表达式话题 【正则表达式--递归匹配与非贪婪匹配 】

[出处:http://www.regexlab.com/zh/regtopic.htm] 引言 本文将逐步讨论一些正则表达式的使用话题.本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文. 1. 表达式的递归匹配 有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况.比如,使用表达式 "\( [^)]* \)" 或者 "\( .*? \)" 可以匹配一对小括号.但是如果括号 内还嵌有一层括号的话 ,如 "( ( ) )&q

php正则表达式中的非贪婪模式匹配的使用

php正则表达式中的非贪婪模式匹配的使用 通常我们会这么写: $str = "http://www.baidu/.com?url=www.sina.com/"; preg_match("/http:(.*)com/", $str, $matches); print_r($matches); 结果: Array ( [0] => http://www.baidu/.com?url=www.sina.com [1] => //www.baidu/.com?u

[ 转载 ] 什么是正则表达式的贪婪与非贪婪匹配

http://www.cnblogs.com/xudong-bupt/p/3586889.html 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c). 非贪婪匹配:就是匹配到结果就好,就少的匹配字符.如上面使用模式p匹配字符串str,结果就是匹配到:abc(

PHP正则 贪婪匹配与非贪婪匹配

$str = ".abcdeabcde"; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0] => abcdeabcde ) -------------------------- 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,默认情况下是贪婪模式; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0]

贪婪匹配和非贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配 string pattern1 = @"a.*c";   // greedy match Regex regex = new Regex(pattern1); regex.Match("abcabc"); // return "abcabc" 非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 string pattern1 = @"a.*?c&

Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配《转》

//贪婪匹配 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>'; reg.RegEx := '<.*>'; //将会全部匹配, 因为两头分别是: < 和 > reg.Rep