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

 

posted @ 2018-04-09 20:03  鲁之敬  阅读(63)  评论(0编辑  收藏  举报