视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中关于正则表达式非贪婪以及多行匹配功能详解
2020-11-27 14:23:20 责编:小采
文档


这篇文章主要介绍了Python正则表达式非贪婪、多行匹配功能,结合实例形式分析了Python正则表达式中非贪婪及多行匹配功能的实现方法与相关注意事项,需要的朋友可以参考下

本文实例讲述了Python正则表达式非贪婪、多行匹配功能。分享给大家供大家参考,具体如下:

一些regular的tips:

1 非贪婪flag

>>> re.findall(r"a(d+?)","a23b") # 非贪婪模式
 ['2']
>>> re.findall(r"a(d+)","a23b")
 ['23']

注意比较这种情况:

>>> re.findall(r"a(d+)b","a23b")
 ['23']
>>> re.findall(r"a(d+?)b","a23b") #如果前后均有限定条件,则非匹配模式失效
 ['23']

2 如果你要多行匹配,那么加上re.S和re.M标志

re.S:.将会匹配换行符,默认.逗号不会匹配换行符

>>> re.findall(r"a(d+)b.+a(d+)b","a23b
a34b")
 []
>>> re.findall(r"a(d+)b.+a(d+)b","a23b
a34b",re.S)
 [('23','34')]
>>>

re.M:^$标志将会匹配每一行,默认^只会匹配符合正则的第一行;默认$只会匹配符合正则的末行

>>> re.findall(r"^a(d+)b","a23b
a34b")
 ['23']
>>> re.findall(r"^a(d+)b","a23b
a34b",re.M)
 ['23','34']

但是,如果没有^标志,

>>> re.findall(r"a(d+)b","a23b
a34b")
 ['23','43']

可见,是无需re.M

import re
n='''12 drummers drumming,
11 pipers piping, 10 lords a-leaping'''
p=re.compile('^d+')
p_multi=re.compile('^d+',re.MULTILINE) #设置 MULTILINE 标志
print re.findall(p,n) #['12']
print re.findall(p_multi,n) # ['12', '11']
import re
a = 'a23b'
print re.findall('a(d+?)',a) #['2']
print re.findall('a(d+)',a) #['23']
print re.findall(r'a(d+)b',a) #['23']
print re.findall(r'a(d+?)b',a) # ['23']
b='a23b
a34b'
''' . 匹配非换行符的任意一个字符'''
print re.findall(r'a(d+)b.+a(d+)b',b) #[]
print re.findall(r'a(d+)b',b,re.M) # ['23', '34']
print re.findall(r'^a(d+)b',b,re.M) # ['23', '34']
print re.findall(r'a(d+)b',b) #['23','34'] 可以匹配多行
print re.findall(r'^a(d+)b',b) # ['23'] 默认^只会匹配符合正则的第一行
print re.findall(r'a(d+)b$',b) # ['34'] 默认$只会匹配符合正则的末行
print re.findall(r'a(d+)b',b,re.M) #['23', '34']
print re.findall(r'a(d+)b.?',b,re.M) # ['23', '34'] 表达式中的'.'匹配除换行符以外的字符,'?'匹配前一个字符0次或1次
print re.findall(r"a(d+)b", "a23b
a34b") # ['23', '34']

注:Python3.4中,print为函数,需要加括号

下载本文
显示全文
专题