python-正则表达式
1.正则表达式是用来干嘛的?
用来匹配字符串的
s='hello world' print(s.find('lo')) #返回第一个元素索引位置 ret = s.replace('ll','xx') #将ll替换为xx print(ret) print(s.split(' '))# 以空格分隔,得到一个数组
string 提供的方法是完全匹配,正则表达式可以模糊匹配
引入正则表达式: 模糊匹配
import re
ret=re.findall('w\w{2}l','hello world') print(ret) ret=re.findall('alex','dsfawefoalexasdf') #findall完全匹配 print(ret)
元字符 . ^ $ * + ? {} [] \ () \
1. . (通配符) :除换行符\n外所有都可以代替,但只能代替一位字符
ret=re.findall('a..x','dsfawefoalexasdf') #findall完全匹配 print(ret)
2. ^ :必须从第一个字符开始匹配,以..开头
ret=re.findall('^h...o','hellodfadf') #findall完全匹配 print(ret)
3. $ :必须以...结尾
ret=re.findall('h...o$','wedhello') #findall完全匹配 print(ret)
4. * : 重复匹配 (通常与其它元字符共用 ..... 等价于 .* aaaa 等价于a*) 重复匹配0到多次
ret=re.findall('a.*','sdsdfalexfdslifa') #findall完全匹配 print(ret)
5 + : 重复匹配 1到无穷次(最少有一个)
ret=re.findall('ab+','sdsdfabbblexfdabslifa') #findall完全匹配 print(ret)
6. ? :重复匹配 0到1次(多了匹配不上)
ret=re.findall('a?b','sdsdfabbblexfdabslifa') #findall完全匹配 print(ret)
7. {} :重复匹配,自己定重复次数 {3}重复三次 {3,5}重复3,4,5次,有最多的匹配最多的5次 (贪婪匹配)
ret=re.findall('a{1,5}b','sdsdfaaaaabbblexfdabslifa') #findall完全匹配 print(ret)
结论: *等价于{0,正无穷}
+等价于{1,正无穷} {1,}
?等价于{0,1}
推荐使用前者
字符集:取消元字符的特殊功能(\ ^ -例外)
8.[] :[c,d,e]匹配c或d或e [a-z]匹配a到z中任意字母
ret=re.findall('a[c,d ,e]x','sdadxsdfaaaaabbblexfdabslifa') #findall完全匹配 print(ret) ret=re.findall('[w,*]','adx*') #findall完全匹配 print(ret) ret=re.findall('[1-9a-zA-Z]','24slSZ') #findall完全匹配 print(ret) ret=re.findall('[1-9,a-z,A-Z]','24slSZ') #findall完全匹配 print(ret)
[^] :^放在[]里,匹配取反 [^t]匹配除t外所有字符
[^a,b] :表示匹配除a,b以外所有字符
ret=re.findall('[^S,l]','24slSZ') #findall完全匹配 print(ret)
9. \ : 反斜杠后面元字符去除特殊功能
反斜杠后面跟普通字符实现特殊功能
\d 匹配任何十进制数,相当于[0-9]
\D 匹配任何非数字字符,相当于[^0-9]
\s 匹配任何空白字符,相当于[\t\n\r\f\v]
\S 匹配任何非空白字符,相当于[^\t\n\r\f\v]
\w 匹配任何字母数字字符,相当于[a-zA-Z0=9]
\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9]
\b 匹配一个特殊字符边界,也就是指字母与特殊字符之间的边界
print(re.findall('\d{11}','dsfaw1223423425232as')) print(re.findall('\saas','jd aasaaj')) print(re.findall('\wfa','dsfaw1223423425232as')) print(re.findall(r'I\b','Hello,I am a LIST'))
################################################################
re.search 找符合条件的第一个结果,找到就不往下找,返回不是字符串
print(re.search('sz','sdfszjsdfszdsf')) ret=re.search('a\b','a\bgj').group() print(ret) ret=re.search('\\\\','a\sdagj') print(ret) ret=re.search(r'\\','a\dsfgj') #r是把\变成原生字符 print(ret)
##########################################################
10. ():()里为一个组
print (re.search('(as)+','dsfdsfasdfsdas').group()) print (re.search('(as)|3','3as3').group()) ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo') print(ret.group()) print(ret.group('id')) print(ret.group('name'))
正则表达式的方法:
1. findall() :所有的结果都返回到一个列表里
2. finditer() :将所有返回的结果封装到一个迭代器里 3. search() :返回匹配到的第一个对象(object),对象可以调用group()拿到返回结果 4. match() :只在字符串开始匹配,也返回匹配到的第一个对象(object),对象可以调用group()f返回结果
5. sub() : 替换
6. subn() : 替换,并返回替换次数
ret=re.match('asd','asdfewfaasd') print(ret) print(ret.group())
ret = re.subn('w','a','www.baidu.com')
print(ret)
ret = re.finditer('\d','dasdf34sd')
print(next(ret).group())
4. split() :分隔
ret=re.split('k','dddwesdkafew') print(ret) ret=re.split('[s,f]','fdsudefjsow') #先分s,结果后分f print(ret) ret=re.sub('j..','s....','kdfsjoajws') #与replace相同 最少三个参数,替换前,替换后,要替换的范围 print(ret) ret=re.compile('j..','s....','kdfsjoaj')# print(ret) obj=re.compile('\.com')# ret=obj.findall('dsklf.comlsdfj') print(ret)
################################################################
?: 取消组的权限
ret = re.findall('www.(\w+).com','www.baidu.com') print(ret)#['baidu'] ret = re.findall('www.(?:\w+).com','www.baidu.com') print(ret)#['www.baidu.com']
# 计算器
s='1+2*(3*6+6*(9\3))'
# 第一步匹配到最里面的括号
re.search('\( [^()]+\)',s)
################################################################
浙公网安备 33010602011771号