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'].

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

  

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

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

    举个栗子: v=jfedu.shiyiwen.com echo ${v%.*} 一个%为非贪婪匹配,即匹配最短结果.%从右到左进行非贪婪匹配,匹配什么呢? 匹配已 .*的字符. 那么当然是匹配到了.c ...

  2. 正则表达式 整理(\w \s \d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $ \b 单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())

    re.findall  匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表 一. 匹配单个字符 import re # \w 匹配所有字母.数字.下划线 re.find ...

  3. php正则贪婪匹配与非贪婪匹配一些例子

    http://www.111cn.net/phper/210/55600.htm 贪婪模式匹配的原则是: 在可匹配也可不匹配的情况下, 优先匹配,直到不能匹配成功的情况下,记录备选状态,并把匹配控制交 ...

  4. php正則表達式中的非贪婪模式匹配的使用

    php正則表達式中的非贪婪模式匹配的使用 通常我们会这么写: $str = "http://www.baidu/.com? url=www.sina.com/"; preg_mat ...

  5. 廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配

    1.贪婪匹配 问题:给定一个字符串表示的数字,判断该数字末尾0的个数? "123000": 3个0 "10100": 2个0 "1001": ...

  6. VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :

    VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下: ...

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

    $str = ".abcdeabcde"; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0] =& ...

  8. Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配

    Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配 //贪婪匹配 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   ...

  9. re 正则匹配的非贪婪匹配

    非贪婪匹配 将尽可能少的匹配内容,当?出现在其他的重复次数后面时会将贪婪模式改为非贪婪模式. ? 如 abc.*? abc.+? 非贪婪匹配:尽可能少的匹配{n,}?{,n}?{n,m}?*? # * ...

随机推荐

  1. C语言--函数嵌套调用

    一.实验作业(6分) 本周作业要求: 选一题PTA题目介绍. 学习工程文件应用,设计实现学生成绩管理系统. 学生成绩管理系统要求 设计一个菜单驱动的学生成绩管理程序,管理n个学生m门考试科目成绩,实现 ...

  2. [转帖]hdfs hbase hive hbase适用场景

    hdfs hbase hive hbase适用场景 https://www.cnblogs.com/liyulong1982/p/6001822.html Hive 不想用程序语言开发MapReduc ...

  3. java.lang.reflect.InvocationTargetException at shade.com.datastax.spark.connector.google.common.base.Throwables.propagate(Throwables.java160)

    org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 29.1 failed 4 tim ...

  4. GFS(Google File System,谷歌文件系统)----(1)文件系统简介

    分布式文件系统 系统是构建在普通的.廉价的机器上,因此故障是常态而不是意外 系统希望存储的是大量的大型文件(单个文件size很大) 系统支持两种类型读操作:大量的顺序读取以及小规模的随机读取(larg ...

  5. Essential C++ Reading Notes

    Chapter1 P6, 1.2 Why //#include<string> we still can use "string user_name"? -->c ...

  6. MongoDB 聚合函数及排序

    聚合函数 最大值  $max db.mycol.aggregate([{$group : {_id : "$by_user", num_max : {$max: "$li ...

  7. spring 框架的核心总结

    最近在学习Java语言,从而也学习了SpringFramework 这个大名鼎鼎的框架.从而做一些的记录. 题外话: 学习过几种不同的语言,后来知道所有的编程语言里所有的概念翻来覆去都是一样的事物,只 ...

  8. spring cloud微服务实践五

    本篇我们来看看怎么实现spring cloud的配置中心. 在分布式系统中,特别是微服务架构下,可能会存在许多的服务,每个服务都会存在一个或多个的配置文件.那怎么多的配置文件的管理就会成为一个大问题. ...

  9. SAS学习笔记7 合并语句(set、merge函数)

    set函数:纵向合并数据集 set语句进行纵向合并.set语句的作用是将若干个数据集依次纵向连接,并存放到data语句建立的数据集中.若set后面只有一个数据集,此时相当于复制的作用 注:data语句 ...

  10. 【解决方法】You seem to have the current working directory in your LD_LIBRARY_PATH environment variable.

    参考地址:https://blog.csdn.net/qq_24755999/article/details/78722788 You seem to have the current working ...