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)
################################################################
posted @ 2018-09-06 22:32  鲨鱼伊牧  阅读(232)  评论(0)    收藏  举报