python贪婪函数 python re 贪婪( 二 )


第二个:如果你理解了上面的,你就知道他俩在这没什么区别 。因为(\d.*\d)这里面的.*都没机会贪婪 。所以2和1的过程差不多 。
第三个:我在贴吧也有回复顺便粘过来 。
.*?(\d.*\d) 这个来说.*?是非贪婪也就是懒惰它是尽量少匹配 。
所谓贪婪就是就是只要满足我的我先来,一直到不满足我的我才停 。
【python贪婪函数 python re 贪婪】比如(a|b)*b 去查找aaaababaab (ab)*开始会把所有都给吞掉,到b时回溯一位正好满足那么结果就是 整个字符串 。aaaababaab
而.*?这样的属于懒惰匹配,我尽量少来 , 让给后面的来 。后面的不行我再来 。
还拿(a|b)*?b 去查aaaababaab 这时它懒惰了只查(a|b){0}这是最懒惰的情况,然后交给后面,后面的b一看是a回溯(告诉它不行你别那么懒,你还要继续)于是(a|b)*?匹配一个a继续交给后面 , 后面不行又回溯,直到(a|b)*?配匹到aaaa后面的b满足匹配了那么查找结束 。所以这个返回的是aaaab
再回到你问的.*?(\d.*\d) 查找:发布于2018/12/23
.*?先查找一个.{0}也就是空字符串交给后面\d,\d匹配一个2没问题继续交给后面的.*,而这个.*是咱们说的贪婪模式,他会全吞所有后面的字符018/12/23,后面的\d发现没字符了回溯.*吐出一个3,\d匹配成功结束查找
所以re.findall('.*?(\d.*\d)',content),返回['2018/12/23']
第四个:在这里再分析一下 。.*?(\d.*?\d)两个懒惰,上面说了很多了.*?首先匹配''也就是啥都不吃 , \d匹配2,.*?又匹配'',\d匹配0匹配成功 。那么返回第一个查找值20 , 因为是findall所以继续往下查找,同理匹配18,继续往下 。.*?还不吃,但是\d发现前面是/不是我的菜回溯,.*?吃掉/,\d匹配1,.*?匹配'',\d匹配2成功返回12,继续往下同上匹配23 。所以结果就是['20', '18', '12', '23']
Python常用的正则表达式处理函数详解 正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便 。
在Python中,我们通过调用re库来使用re模块:
import re
下面介绍Python常用的正则表达式处理函数 。
re.match函数
re.match 函数从字符串的起始位置匹配正则表达式,返回match对象 , 如果不是起始位置匹配成功的话,match()就返回None 。
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式 。
string:待匹配的字符串 。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 。具体参数为:
re.I:忽略大小写 。
re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 。
re.M:多行模式 。
re.S:即 . ,并且包括换行符在内的任意字符(. 不包括换行符) 。
re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 。
re.X:为了增加可读性,忽略空格和 # 后面的注释 。
import re#从起始位置匹配r1=re.match('abc','abcdefghi')print(r1)#不从起始位置匹配r2=re.match('def','abcdefghi')print(r2)
运行结果:
其中,span表示匹配成功的整个子串的索引 。
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式 。
group(num):匹配的整个表达式的字符串 , group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组 。
groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 。
import res='This is a demo'r1=re.match(r'(.*) is (.*)',s)r2=re.match(r'(.*) is (.*?)',s)print(r1.group())print(r1.group(1))print(r1.group(2))print(r1.groups())print()print(r2.group())print(r2.group(1))print(r2.group(2))print(r2.groups())

推荐阅读