一,贪婪与非贪婪
贪婪:尽可能多的匹配
非贪婪:尽可能少的匹配
非贪婪符可以用在*,?,+的后面
*? 重复1次
?? 重复0次
+? 重复0次
代码如下:
s ="greedyaiiii"
reg1 ="greedyai*" # 贪婪
print(re.findall(reg1, s)) # 非贪婪
reg2 ="greedyai*?"
print(re.findall(reg2, s))
运行结果为:
['greedyaiiii']
['greedya']
二,分支条件匹配
关键词:" | "
代码如下:
s ="my phone num=010-11111111 0599-2222222 020-2222222"
reg3 ="0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{2}-\d{7}"
print(re.findall(reg3, s))
运行结果为:
['010-11111111', '0599-2222222', '020-2222222']
捕捉与非捕捉(?:)
含义:
非捕捉:不破坏正则表达式的整体性,匹配全部
捕捉:捕捉连续符合正则表达式组内的最后一个组的内容
-------------------------------------------------------------------------------
现在我们有个需求,需要匹配IP地址
正常情况下,我们这么写可以匹配出来
ip ="address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 ="(\d{1,3}\.){3}\d{1,3}"
print(re.findall(reg4, ip))
但是,这里实际的运行结果为 ['0.', '125.', '0.']
原因是当分组时,会自动匹配捕捉模式,捕捉是是连续符合正则表达式组内的最后一个组的内容,所以这边匹配的就是每组的第三个
这个时候我们需要用到不捕捉,关键字就是 ?:
ip = "address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 = "(?:\d{1,3}\.){3}\d{1,3}"
print(re.findall(reg4, ip))
这样得出的结果就是:['128.0.0.1', '125.125.125.125', '0.0.0.0']
还有个例子如下:
address ="http://www.baidu.com"
reg5 ="http://(?:w){3}\.[a-z]*\.com"
print(re.findall(reg5, address))
零宽断言
(?=reg) 匹配reg前面的内容
(?<=reg) 匹配reg后面的内容
(?!reg) 匹配后面跟的不是reg的内容
(?<!reg) 匹配前面不是reg的内容
例子如下:
s1 ="hellogreedyailove"
reg6 ="hel{2}o(?=greedyai)"
print(re.findall(reg6, s1))
这里匹配的就是greedyai前面的内容,故结果就是hello
reg7="(?<=greedyai)[a-z]*"
print(re.findall(reg7, s1))
这里匹配的就是greedyai后面的内容,故结果就是hello
reg8="lo(?!greedyai)"
print(re.findall(reg8, s1))
这里返回的是love里面的lo,因为匹配的是后面跟着的不是greedyai的内容,前面hello里的lo后接greedyai
reg9 ="(?
print(re.findall(reg9, s1))
返回的是hello的2个l,因为这里返回的是l前面不是greedyai的内容,那love里的l就被排除了
网友评论