正则表达式

正则表达式

     1.是针对字符串的

     2.做模糊的匹配

    

     两种匹配方式

         1.普通的字符串匹配

            >>>re.findall('huang','grtgjkeqwhuangjianto')

         2.元字符(模糊匹配)

           . 代表取代一位字符      ^表示开头     $表示结尾    

            * 表示重复上一个字符的(0,+无穷)       这个是贪婪匹配

             a = 'abbcbbbdbbbb'                  re.findall(bb*,a)    首先会重复0次(及不存在这个字符),再1次,直到重复字符串这长,及有b,bb,bbb,bbbb,bbbbb等等模糊匹配,寻找a中能匹配上的,  即bb,bbb,bbbb   组成列表表达出来。注意,

                                                                                             开始时一个b的时候,虽然可以分出来匹配,但是 贪 婪 匹 不会配会拆分b出来匹配,自会最大限度匹配多的b

            + 表示重复上一个字符的(1,+无穷)     比上面多了起始最少存在这个字符(1次)

           ? 表示重复上一个字符的(0,1)次 ,及字符存在不存在     先匹配最大的一次,再匹配0次

           { } 自定义重复次数    {0,} ==*      {1,}==+    {0,1} ==?   {6}:重复上一字符六次          {1,6}:重复上一字符1到6次    

               print(re.findall('b{1,5}$',b))   重复结尾b字符1到5次

 

          [  ]    字符集,表示取其中一个      print(re.findall('q[a-z]*','quo'))       注意 [ ]在里面除了一些特殊字符(\,-,^),其余都按正常字符串处 理  这里把【a-z】看成一个整体       *重复上一个字符,就是任意取a-z一个元素 ,  相当于匹配q[a-z][a-z].....

                                                                                                                   *是完全照搬上一个元素,不可把不确定取值固 定再 重复。   ^在[  ] 中表示出去什么之外  [^a-z],除小写字母外,都可以去取任 意一个字符                                                                                                        

 

         \    转义符     把有意义的字符变成不同字符       把不同字符变成有意义的

               \d  匹配数字(一位)    \d+ 匹配任意数字      \D 相反 不是数字                   \s 取空白  \S 相反       \w 字母数字字符 相当于【aA-zZ】,[0-9]         \b  匹配特殊字符包括空格

           关于转义符,我们要注意,在re模块中\是有意义的,想直接取其字符,需要再加\来转义

         print(re.findall('ab\\c','degehgab\cde')) #注意,我们转义都是再re模块中进行,re是一个相对独立的代码,我们想在re模块中表现
                     #\c就要输入 \\c 但是系统会先把这个交给python解释器,python解释器先解释一遍,想
                     #要传入两个\必须输入四个\\\\表示转义了两个\,变成普通字符传入re模块中,也可前面
                     #加入r表示python对匹配字符原声传入,不做任何解释

   #其实这就是在原字符串中要匹配带\的字符,匹配条件中\的转义的转换,python一次,re模块一次,才能把普通字符\传入匹配条件

 

print(re.findall('ab\\\\\*','rfhrab\*'))  先考虑转义*,在考虑把\转义成字符串

 

        () 分组    

print(re.search("(?P<name>[a-z]+)(?P<number>\d+)",'123abc456def').group('name'))
#?P固定格式,<>里面是赋一个变量名,把后面按照匹配条件
# 匹配到的数据存起来,看起来花里胡哨的,其实就是多加一个变量把搜索数据存在该变量下,
#search 找到一个符合的数据就停止匹配 search 得到的都是一个对象.需要用group取出

 

print(re.findall('jianjian|xiaojian','fdjianjiangtjian'))    #|是或者的意思,跟linux中一样



print(re.match('123','123dasd123').group())                  #search一样,就是强制匹配头部字符,就相当于加了一个^号,输出对象

print(re.split(' ','huangjian is good')) #以什么分开
print(re.split('[a|b]',"huangjian is niubi")) #如果有分组符号,符号里面是先以a分段,再把结果给n分段
print(re.split('(a|b)',"huangjian is niubi")) #注意如果是分组的字符来作为分割条件,则保留分割符
print(re.sub('h','H','huangjian')) #替换
print(re.sub('[a|b]','1','huangjianniubi'))
print(re.subn('[a|b]','1','huangjianniubi')) #替换,多了一个替换次数

haha = re.finditer('[\d|a-z]','shuzi123456HAHA') #findall目的一样,但是却是一个生成器,可以用next方法取或者for循环取
for i in haha: #到对象,再用group取其值
print(i.group())

pipei = re.compile('huangjian') #直接先把匹配条件赋值

pipei.findall('mingzishihuangjian') #直接用条件寻找,这样可以避免重复多次写一样的条件


print(re.findall('www\.(baidu|taobao).com','wangzhan is www.baidu.com sousuo')) #注意,这个跟分段split有点像,如果字符是分组字符,则会
#出现一些特殊的情况,split是保留分组符,而findall是找到符合字符串,只保留分组字符
print(re.findall('www\.(?:baidu|taobao).com','wangzhan is www.baidu.com sousuo')) #强行不让系统只显示分组字符

其实分组的目的就是为了只关注那一块, 或者把什么字符看成一个整体来匹配,主要是前者,关注什么给什么分组在附加变量就能很好的找到关注的内容

#findall 得到结果是列表 search得到结果是对象 finditer得到结果是生成器 mathsearch一样,只是前面加了^




posted @ 2020-07-18 10:31  xiaojianfir  阅读(298)  评论(0)    收藏  举报