re模块
re模块:正则表达式
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。
re模块的一些元字符应用:匹配
以匹配的条件依次与字符串的一个个字符匹配,没有特定指定一般从左至右匹配。
import re print(re.findall('\w','ab 12\+- *&_')) #打印出字符串里字母数字及下划线的字符 print(re.findall('\W','ab 12\+- *&_')) #打印出字符串里不是字母数字和下划线的字符 print(re.findall('\s','ab \r1\n2\t\+- *&_')) #打印出字符串里空白格字符,换行符也是空白字符 print(re.findall('\S','ab \r1\n2\t\+- *&_')) #打印出字符串里不是空白格字符的字符 print(re.findall('\d','ab \r1\n2\t\+- *&_')) #打印字符串里是数字的字符 print(re.findall('\D','ab \r1\n2\t\+- *&_')) #打印字符串里不是数字的字符
print(re.findall('\Aalex','alex is salexb')) #判断字符串是否以alex开头的字符串 print(re.findall('^alex','alex is salexb')) #判断开头是否是alex print(re.findall('sb\Z','alexsb is sbalexbsb')) #判断字符串结尾是否是sb字符 print(re.findall('sb$','alexsb is sbalexbsb')) #判断字符串结尾是否是sb字符 print(re.findall('^ebn$','ebn1')) #判断字符串是以ebn开头,结尾以ebn结尾,这种匹配一般判断字符串是否只存在一个相同字符
重复匹配: . ? * + {m,n} .* .*? 1、.:代表除了换行符外的任意一个字符 print(re.findall('a.c','abc a1c aAc aaaaaca\nc')) print(re.findall('a.c','abc a1c aAc aaaaaca\nc',re.DOTALL)) 2、?:代表左边那一个字符重复0次或1次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) 3、*:代表左边那一个字符出现0次或无穷次 print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) ab* 4、+ :代表左边那一个字符出现1次或无穷次 print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) ab+ 5、{m,n}:代表左边那一个字符出现m次到n次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) print(re.findall('ab{0,1}','a ab abb abbb abbbb abbbb')) #b可以出现0次到1次 print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab{0,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #b可以出现0次到无穷次 print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) print(re.findall('ab{1,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #b可以最少出现1次到无穷次 print(re.findall('ab{1,3}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #b可以出现1次到3次 6、.*:匹配任意长度,任意的字符=====》贪婪匹配 print(re.findall('a.*c','ac a123c aaaac a *123)()c asdfasfdsadf')) ===>['ac a123c aaaac a *123)()c'] #以a开头,以字符串最后的一个字母c结尾,中间无论多少个什么字符,以最长为准。一般不推荐使用这种匹配模式 7、.*?:非贪婪匹配 print(re.findall('a.*?c','a123c456c'))=====》['a123c'] #以a开头,中间无论多少个什么字符,以最短位置的c结尾完成匹配。推荐使用这种匹配模式
():分组 print(re.findall('(alex)_sb','alex_sb asdfsafdafdaalex_sb')) #以alex_sb来匹配,但是只取括号内的alex的字符串 (alex)_sb print(re.findall( 'href="(.*?)"', '<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>') ) <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> # href=".*?" 只取网址链接
#特殊符号在[]内没有特殊意义, []:匹配一个指定范围内的字符(这一个字符来自于括号内定义的) print(re.findall('a[0-9][0-9]c','a1c a+c a2c a9c a11c a-c acc aAc')) #ac中间的第一个字符的范围是0到9的数字,第二个字符范围也是0到9的数字 当-需要被当中普通符号匹配时,只能放到[]的最左边或最右边,否则会有范围到的意思 print(re.findall('a[-+*]c','a1c a+c a2c a9c a*c a11c a-c acc aAc')) print(re.findall('a[a-zA-Z]c','a1c a+c a2c a9c a*c a11c a-c acc aAc')) []内的^代表取反的意思:非,不是的意思 print(re.findall('a[^a-zA-Z]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc')) #匹配ac之间的一个字符不是a到z的字母,和A到Z的字母,就是不是大小写字母的任意字符 print(re.findall('a[^0-9]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc')) #匹配ac之间的字符不是0到9的数字的字符 print(re.findall('([a-z]+)_sb','egon alex_sb123123wxxxxxxxxxxxxx_sb,lxx_sb')) [a-z]+_sb
| :或者 print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next one is my company')) #匹配ies或者iey的字符 (?:):代表取匹配成功的所有内容,而不仅仅只是括号内的内容 print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company')) print(re.findall('alex|sb','alex sb sadfsadfasdfegon alex sb egon'))
# ===========================re其他模块提供的方法介绍=========================== import re #1 print(re.findall('e','alex make love') ) #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里 #2 print(re.search('e','alex make love').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 #3 print(re.match('e','alex make love')) #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match #4 print(re.split('[ab]','abcd')) #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割 #5 print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有 print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love')) #===> love make alex print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数 #6 obj=re.compile('\d{2}') print(obj.search('abc123eeee').group()) #12 print(obj.findall('abc123eeee')) #['12'],重用了obj