今天听到一句话,觉得很在理——"当你遇到一个问题,想到用正则表达式解决时,就变成了两个问题"

这也从侧面说明了正则表达式比较难理解。下面我将用通俗易懂的方式总结一下,最近遇到的一些正则表达式的问题

一. 贪婪匹配的"毛病"

1. 太贪婪就"歇菜"了

匹配模式为r".*(\d*).*",在这个模式中,(\d*)表示贪婪匹配,匹配前面的字符\d,也就是数字0次或无数次,但是我们的字符串中,\d匹配无数次的情况是不存在的(实际上对于search方法,它会找到"1",如果"11"不满足"1"匹配无数次,那么它就会选择匹配 "1" 0次,匹配0次后就直接返回了),因此,(\d*)表示的是匹配前面的数字0次,既然是0次,那么返回的分组的内容应该是空字符串'',group(1)和groups()都能验证这一点,比如group(1)代表返回第1个分组的字符串,groups()返回一个包含所有小组字符串的元组,由于本例中只有一个分组,分组号为1,因此,我们可以看出得到的是空字符串''

但是,有人又问了,为什么.group()看到的是匹配整个字符串?事实上,我们的分组——匹配前面的数字0次——是不起任何作用的,就相当于匹配模式是r".*.*",不信请看下图,结果是不是一模一样?

举个例子,匹配模式是很爱财的朋友,我的银行余额是字符串,有一天他突然向我借钱,哥们,能不能借我很多钱?

我问,具体多少?他说,当然是越多越好啊,呵呵,这个贪心的人。我查询账户余额,一瞅,只剩下10万了,当然选择不借给他!因此我知道他贪得无厌,我自己如果借给他10万,他会问我要20万,30万...甚至更多,所以,对于利欲熏心的朋友,我是拒绝的——最后他一分钱也没拿到,得到的是空(空字符串'')。于是,这位朋友算是看了一眼我的账户余额(search()),灰溜溜的走了

2. "疑心重重"的贪婪

有一天,这个朋友又来了,这次他的疑心又加重了一些,他又向我借钱,哥们,能不能借我很多钱?

我掏出手机查了一下账户余额,上面写着大约"10万",这位朋友就是不死心,明明是不能满足他的贪心,他还死缠着我不放,非要我查清楚具体的明细给他看,而且要精确到小数点之后的几角几分,第一次,我告诉他大约10万,不能借给他,他拿到了空(空字符串''),第二次,当我查询具体明细时,上面显示"101283.88"元,我再次拒绝了他,他又拿了一次空,这就是findall()的作用,返回所有能匹配到的子串

二. 贪婪的"顿悟"

1. "请把贪婪交给别人"

我的朋友在多次借钱无果的情况下,经过我苦口婆心的劝说,终于有点醒悟了,他打算洗心革面,做一个清心寡欲的人

有一天,他突然来找我,哥们,能不能借我点钱,两位数的都成

我一听,妈呀,这改变颇大,得了,借他99块钱还是没问题的,正要掏出99元时,他突然拦住我,表示要看我的账户余额

惊出一身冷汗,但还是抱着信任他的态度,把手机给他,他看了账户余额,"101283.88"元,缓缓地说道,你能借我8毛8吗?

当然可以——我松了一口气,有点怀疑的望着他,对了,你的贪婪哪里去了?

他不假思索的说,我把贪婪给了别人——我们贪婪家族,辈分排在我前面的那个".*",有了他,我可以不背负贪婪的恶名,我只会找到最后面的两位数,对你的余额来说,应该是最少的

2. 非贪婪——"大家都不贪了,才能实现互惠"

有一天,我的朋友开心的跑来找我,说他的前辈也洗心革面了,开始慢慢习惯清贫、习惯满足

我知道,这是我朋友的功劳。当他得到欲望的危害后,他也向布道师一样向前辈们传递这种思想

他的前辈就接收了他的洗礼,并且还刻意在帽子上画了一个"?"的标记,那是他独有的限制自我的符号

当然,这次朋友也是来向我借钱的,哥们,能不能给我借点钱,两位数的都行,就像上次的语气一样

我这时卡里还有"199.88"元,为什么只剩下这么点?是因为最近去炒股了

于是,我拿出99元,最大的两位数给他,跟他说——得了,拿走吧

现在他也不仔细查看我的余额明细了,瞄了一眼大概的余额就收下了

python中正则表达式的一些问题的更多相关文章

  1. python 中 正则表达式 的应用

    python 中 正则表达式 的应用 最近作业中出现了正则表达式,顺便学习了一下. python比较厉害的一点就是自带对正则表达式的支持,用起来很方便 正则表达式 首先介绍一下什么是正则表达式. 正则 ...

  2. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  3. python中正则表达式 re.findall 用法

    在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配. 其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表. 在python源代码中 ...

  4. python中正则表达式re模块详解

    正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了. 先看一下常用的匹配 ...

  5. python中正则表达式在中文字符串匹配时的坑

    之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因.今天终于 ...

  6. js中正则表达式与Python中正则表达式的区别

    今天女票让我帮她写一个js中的正则,来提取电话号码,对于正则规则来说,js与python是基本没有区别的,重点的区别是在一些函数与方法中. python中的正则提取: import re str = ...

  7. Python中正则表达式讲解

    正则表达式是匹配字符串的强大武器,它的核心思想是给字符串定义规则,凡是符合规则的字符串就是匹配了,否则就是不合法的.在介绍Python的用法之前,我们先讲解一下正则表达式的规则,然后再介绍在Pytho ...

  8. 关于Python中正则表达式的反斜杠问题

    之前总是搞不明白正则表达式中的反斜杠的问题.今天经过查阅资料终于搞明白了. 其中最重要的一点就是Python自己的字符串中定义的反斜杠也是转义字符,而正则表达式中的反斜杠也是转义字符,所以正则表达式中 ...

  9. python中正则表达式

    正则表达式是一种通用的字符串匹配技术,是不会因为编程语言不一样而发生变化的如果想查找对应规则的字符串,就可以用正则表达式python中要使用正则表达式需使用re模块,它是正则表达式在python中的封 ...

  10. 第11.21节 Python 中正则表达式的其他扩展功能

    一. 引言 在<第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中 ...

随机推荐

  1. 如何定义 match 常量?

    namespace MathConstants { const double E = 2.71828182845904523536; // e const double LOG2E = 1.44269 ...

  2. 我的Android进阶之旅------>Android使用百度地图时,关于android.permission.BAIDU_LOCATION_SERVICE的声明警告。

    [重要提醒] 定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败. <uses-permission androi ...

  3. SpringMVC 课纲

    SpringMVC 课纲 第一章 SpringMVC 架构 一个简单的 web 项目,校验器 SpringMVC 组件及相互关系 第二章 数据绑定 form标签库 第三章 Converter 和 Fo ...

  4. MySQL学习思维导图

    结束:分享在线下载地址 https://www.xmind.net/m/7t6U/

  5. 022-Spring Boot 构建微服务实战

    一.概述 二. 2.1.微服务 将原来一个大的系统,拆分成小系统 每个小系统分别开发,测试,维护 2.2.调用方 服务提供方式:rest(http)[restTemplate,httpclient]. ...

  6. Android-实现切换Fragment页功能

    场景:使用Fragment实现切页. 类结构: 一:Activity Activity中使用getSupportFragmentManager().beginTransaction()来填充一个Fra ...

  7. 剑指offer 面试59题

    面试59题: 题目:队列的最大值. 题目一:滑动窗口的最大值. 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如:如果输入数组为[2,3,4,2,6,2,5,1]及滑动窗口大小为3,那 ...

  8. Pacemaker详解

    一.前言 云计算与集群系统密不可分,作为分布式计算和集群计算的集大成者,云计算的基础设施必须通过集群进行管理控制,而作为拥有大量资源与节点的集群,必须具备一个强大的集群资源管理器(Cluster sy ...

  9. Java Collection API

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...

  10. java多线程(内附实例:窗口售票问题、人和叉子的问题)

    java多线程的开发有两种方法: (1)实现Runnable接口: (2)继承Thread类: 区别: (1)由于java中一个类只能继承一个父类,但是可以实现多个接口,所以实现Runnable接口比 ...