正则表达式高级使用

2019-02-14  本文已影响0人  好多可乐

一,贪婪与非贪婪

贪婪:尽可能多的匹配

非贪婪:尽可能少的匹配

非贪婪符可以用在*,?,+的后面

*?  重复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就被排除了

上一篇 下一篇

猜你喜欢

热点阅读