python正则非贪婪模式
上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配
那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了
原理就是利用?与其他匹配次数规则进行组合
单个匹配规则:
* = {0,}表示匹配0-n次
+ = {1,}表示匹配1-n次
?= {0,1}表示匹配0-1次
三者可组合成非贪婪模式匹配次数解析:*? +? ??
简而言之:它们必须结合左右的子串进行匹配,左边正则必须非空,右边正则可以为空,中心思想就是在匹配到右边的正则之前尽可能少次匹配左边的正则
match是从头开始匹配,找到第一个符合条件的子字符串
?? =(reg1?)?reg2 = (reg1{0,1}){0,1}reg2
In [149]: re.match(r'\w??\d','123wer123') # 第一个\d即数字之前,\w只能匹配0-1次; 这里第一个\d之前可匹配\w 0次,返回第一个数字
Out[149]: <re.Match object; span=(0, 1), match='1'> In [150]: re.match(r'\w??\d','w123wer123') # 第一个\d数字之前,\w只能i匹配0-1次;这里第一个\d之前\w匹配到一次,返回一个字母+第一个数字
Out[150]: <re.Match object; span=(0, 2), match='w1'> In [151]: re.match(r'\w??\d','wx123wer123') # 第一个\d数字之前,\w只能匹配0-1次; 这里\d前面匹配到\w 2次,match失败,返回None In [152]: re.match(r'\w??\d','wxwer') #\d至少匹配1次; 这里\d没匹配到,所以最终match失败,返回None In [153]: re.match(r'\w??','wxwer') # \w只能匹配0-1次;这里选少的匹配0次
Out[153]: <re.Match object; span=(0, 0), match=''>
*? =(reg1*)?reg2 = (reg1{0,}){0,1}reg2
In [154]: re.match(r'\w*?\d','123wer123') # 第一个\d前\w只能匹配0-n次; 这里\d前可匹配0次\w, 返回第一个数字
Out[154]: <re.Match object; span=(0, 1), match='1'> In [155]: re.match(r'\w*?\d','wx123wer123') # 第一个\d前\w只能匹配0-n次;这里\d前匹配2次\w, 返回2个字母+一个数字
Out[155]: <re.Match object; span=(0, 3), match='wx1'> In [156]: re.match(r'\w*?\d','wxe') # \d至少要匹配一次;这里\d没有匹配项,最终匹配失败,返回None In [157]: re.match(r'\w*?','wxe') # \w只能匹配0-n次; 这里最少匹配0次
Out[157]: <re.Match object; span=(0, 0), match=''>
+? =(reg1+)?reg2 = (reg1{1,}){0,1}reg2
In [160]: re.match(r'\w+?\d','%123wer123') # 第一个\d前\w匹配只能匹配1-n次;这里第一个\d前\w只匹配到0次,最终match失败,返回None In [161]: re.match(r'\w+?\d','wsx123wer123') #第一个\d前\w只能匹配1-n次;这里第一个\d前\w最少匹配3次,最后返回三个字母+第一个数字
Out[161]: <re.Match object; span=(0, 4), match='wsx1'> In [162]: re.match(r'\w+?\d','wsxwer') # \d必须至少匹配到一次;这里\d匹配0次,最终匹配失败,返回None In [163]: re.match(r'\w+?','wsxwer') # \w只能匹配1-n次;这里\w最少可匹配1次,即返回第一个字母
Out[163]: <re.Match object; span=(0, 1), match='w'>
In [165]: re.match(r'w+?\w','wsxwer') # 第一个\w之前,w只能出现1-n次;这里w最少可匹配到一次,所以返回w+第一个字母
Out[165]: <re.Match object; span=(0, 2), match='ws'>
In [27]: re.match(r'aw+?\w','awwsxwer') # 第一个字母必须是a,在a和\w之间,w可出现1-n次; 这里w最少可匹配到1次
Out[27]: <re.Match object; span=(0, 3), match='aww'>
#延伸思考32和33分别返回什么呢,答案见评论
In [32]: re.match(r'aw+?s','awawsxwer')
In [33]: re.match(r'(aw)+?s','awawsxwer')
python正则非贪婪模式的更多相关文章
- vim 正则非贪婪模式
比如多匹配使用 .* 效果自然是贪婪模式,JS 的非贪婪很简单,是 .*? 即可,而 vim 不同,语法是 .\{-},注意 \ 转义.
- JavaScript 正则表达式——预定义类,边界,量词,贪婪模式,非贪婪模式,分组,前瞻
㈠预定义类 示例:匹配一个ab+数字+任意字符的字符串:ab\d. ㈡边界 正则表达式常用的边界匹配字符 ⑴示例1:第一个是没写单词边界 第二个是加上字符边界的效 ...
- python基础:re模块匹配时贪婪和非贪婪模式
python贪婪和非贪婪 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪则相反,总是尝试匹配尽可能少 ...
- python 正则表达式与JSON-正则表达式匹配数字、非数字、字符、非字符、贪婪模式、非贪婪模式、匹配次数指定等
1.正则表达式:目的是为了爬虫,是爬虫利器. 正则表达式是用来做字符串匹配的,比如检测是不是电话.是不是email.是不是ip地址之类的 2.JSON:外部数据交流的主流格式. 3.正则表达式的使用 ...
- 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'
在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...
- 第11.9节 Python正则表达式的贪婪模式和非贪婪模式
在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...
- js正则中的贪婪和非贪婪模式问题总结
var b="abeeee:eeeee:eeeeeab"; console.log(b.match(/e+\:e+/g));//["eeee:eeeee"]贪婪 ...
- python正则表达式贪婪与非贪婪模式
之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...
- python 贪婪和非贪婪模式
这样的正则表达式: r'\*(.+)\*' 如果想要匹配*something*这样的一个串按道理说是没问题的 但是如果文本是*this* is *something* 那么我们的正则表达式就会采取贪 ...
随机推荐
- BZOJ 2306: [Ctsc2011]幸福路径
Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它 ...
- 栈和队列----将单链表的每K个节点之间逆序
将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...
- [TJOI2013] 攻击装置 - 二分图匹配
给定 \(N \times N\) 棋盘,某些格子是障碍,问可以放置的互不侵犯的马的个数 黑白染色后建立二分图,求最大独立集 = 总点数 - 最大匹配数 注意把反边也连上会WA掉(脑抽一发血) #in ...
- jqgrid中分页和搜索,jqgrid loadonce:true后trigger("reloadGrid")无效
第一次接触jqgrid,发现项目中好多地方都用到. jqgrid是典型的B/S架构(浏览器/服务器模式),服务器端只需提供数据管理,浏览器只需负责数据显示. jqGrid是用ajax实现对 ...
- C语言链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4, ...
- 回环屏障CyclicBarrier
上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDownLatch的await和countDown方法就会立刻返 ...
- 在cc.EventListener.TOUCH_ONE_BY_ONE事件中判断拖动物离哪边近飞向那边
需将拖动物坐标和要飞向物坐标转化为整个layer的坐标,因为人们判断远近是根据整个layer来看的.
- docker安装elasticsearch和head插件
使用 Docker 拉取ElasticSearch镜像 docker pull elasticsearch:7.0.0 查看镜像 ID docker images 运行 docker run -e E ...
- kali 所有版本
首先打开kali官方网站 第一步 第二步 找到 第三步点击标黄色的地方 http://cdimage.kali.org/ 第四步将网址中的cdimage替换为old http://old.kali.o ...
- Unity中引入Supersocket.ClientEngine并测试
在使用Supersocket Server的过程中,发现Server是不支持.net 3.5的. 1.Server端中的几个Command: namespace SuperSocketProtoSer ...