python中正则表达式的一些问题
今天听到一句话,觉得很在理——"当你遇到一个问题,想到用正则表达式解决时,就变成了两个问题"
这也从侧面说明了正则表达式比较难理解。下面我将用通俗易懂的方式总结一下,最近遇到的一些正则表达式的问题
一. 贪婪匹配的"毛病"
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中正则表达式的一些问题的更多相关文章
- python 中 正则表达式 的应用
python 中 正则表达式 的应用 最近作业中出现了正则表达式,顺便学习了一下. python比较厉害的一点就是自带对正则表达式的支持,用起来很方便 正则表达式 首先介绍一下什么是正则表达式. 正则 ...
- 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...
- python中正则表达式 re.findall 用法
在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配. 其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表. 在python源代码中 ...
- python中正则表达式re模块详解
正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了. 先看一下常用的匹配 ...
- python中正则表达式在中文字符串匹配时的坑
之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因.今天终于 ...
- js中正则表达式与Python中正则表达式的区别
今天女票让我帮她写一个js中的正则,来提取电话号码,对于正则规则来说,js与python是基本没有区别的,重点的区别是在一些函数与方法中. python中的正则提取: import re str = ...
- Python中正则表达式讲解
正则表达式是匹配字符串的强大武器,它的核心思想是给字符串定义规则,凡是符合规则的字符串就是匹配了,否则就是不合法的.在介绍Python的用法之前,我们先讲解一下正则表达式的规则,然后再介绍在Pytho ...
- 关于Python中正则表达式的反斜杠问题
之前总是搞不明白正则表达式中的反斜杠的问题.今天经过查阅资料终于搞明白了. 其中最重要的一点就是Python自己的字符串中定义的反斜杠也是转义字符,而正则表达式中的反斜杠也是转义字符,所以正则表达式中 ...
- python中正则表达式
正则表达式是一种通用的字符串匹配技术,是不会因为编程语言不一样而发生变化的如果想查找对应规则的字符串,就可以用正则表达式python中要使用正则表达式需使用re模块,它是正则表达式在python中的封 ...
- 第11.21节 Python 中正则表达式的其他扩展功能
一. 引言 在<第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中 ...
随机推荐
- [置顶] 我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书
Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和的证书指纹SHA1码来识别的,如百度地图SDK.这样如果使用默认自动生成的debug的话就会给开发调试工作带 ...
- MySQL 第四天
回顾 列属性: 主键, 自增长, 唯一键 关系: 一对一,一对多和多对多 范式: 三层范式 1NF: 字段设计必须符合原子性 2NF: 不存在部分依赖(没有复合主键) 3NF: 不存在传递依赖 ...
- 笔记:zookeeper Hello World
下载zookeeper-3.4.6 , 试用了一下 standlone 启动 ./bin/zkServer.sh start 注: Usage: ./bin/zkServer.sh {start|st ...
- Python利用subprocess起进程
from multiprocessing import Process, Pool import time import subprocess def task(msg): print 'hello, ...
- Can’t connect to local MySQL server through socket 解决办法
启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...
- GAN综述
生成式对抗模型GAN (Generativeadversarial networks) 是Goodfellow等[1]在 2014年提出的一种生成式模型,目前已经成为人工智能学界一个热门的研究方向,著 ...
- python 里安装 tensorflow 后运行出错的问题解决
如果出现一下错误: libcublas.so.8.0: cannot open shared object file: No such file or directory 原因是没有 cuda 环境, ...
- python中json.dumps使用的坑以及字符编码
我们知道,python中的字符串分普通字符串和unicode字符串,一般从数据库中读取的字符串会自动被转换为unicode字符串 下面回到重点,使用json.dumps时,一般的用法为: >&g ...
- C++ 语言操作符的优先级
cppreference.com -> C++ 操作符优先级 C++ 操作符优先级 优先级 操作符 1 () [] -> . :: ! ~ ++ ...
- docker学习笔记2--对镜像/容器的命令操作
Docker启动一个Centos镜像 我们下载完成一个Centos镜像之后,开始启动 docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停 ...