sunny-cheng  

正则表达式

  --对字符串匹配的模式,对比两个字符,从中取舍的模式和逻辑

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

 

特殊符

  . 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。
  * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
      ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
      $      匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
  () 分组匹配,括号中的内容相当一个整体
  [] 匹配其中之一,[abc]  --找出或a或b或c
  {n,m} 匹配前一个字符n到m次
   +  匹配前一个字符1次或多次 
   ?  匹配前一个字符1次或0次
   | 匹配|左或|右的字符
   \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 转义字符

 

  \A 只从字符开头匹配,同^
    \Z 匹配字符结尾,同$
  \d 匹配数字0-9
  \D   匹配非数字
  \w   匹配[A-Za-z0-9]
  \W   匹配非[A-Za-z0-9]
  \s   匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
  \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

 

 

 

 

 

 

 

 

 

 

 

常用匹配语法

  • re.match            从头开始匹配
  • re.search                                   匹配包含
  • re.findall                                         把所有匹配到的字符放到以列表中的元素返回
  • re.split                                            以匹配到的字符当做列表分隔符
  • re.sub                                            匹配字符并替换
  • re.fullmatch                                    全部匹配


str = '黄鹤,17722622449,浙江省 温州市 惠阳区 淡水街道 碧华花园 ,516200'

      (江南皮革厂那个黄鹤,你没有看错,就是他)

 re.match 

  #取黄鹤手机号码(为什么要他号码, 我也不知道,突然想到他了)

  results = re.match('\d{11}',str)    #None

    这个匹配的是 str 从黄鹤开始匹配的,所以不通匹配不上,也即是从起始位置匹配

   用re.plit将str 以 ‘,’分割匹配

    phone = re.split(',',str)[1]   

    results = re.match('\d{11}',str)    #<re.Match object; span=(0, 11), match='17722622449'>

                                      #span=(0, 11)  匹配到 phone[0:11]也就是字符串起始位置

   

   ph = re.match('\d{5}',results1)    # match='17722'    

      ph = re.match('\d{15}',results1)   # None   

      上面可以看出 re.match只要能满足pattern 数量都是可以取出来,超过就取不出

re.search 

   #取黄鹤手机号码

   results = re.search ('\d{11}',str)   # match='17722622449'

   这个因为是匹配的包含,所以不用分割就能取出的 

 

re.findall

   results = re.findall('\d{11}',str)   # ['17722622449'] 

     results = re.findall('\d{4}',str)  # ['1772', '2622', '5162']

   re.findall 以list类型返回  ,这个匹配过程是,先匹配手机号4个数字'1772',发现还有,再取4个'2622',最后剩下3个‘449’

       不够条件,往下匹配邮箱时候取4个‘5162’ ,再没有匹配到,所以返回这个结果。

  

re.fullmatch 

  全部匹配 :也就是说他要多少就必须是匹配多少不能多不能少,

    而前面几个都是可以不超过他取的数量就可以

    results= re.fullmatch('\d{10}',phone)   #None    这个手机是11位数 所以取不出

    results= re.fullmatch('\d{11}',phone)  # match='17722622449' 

大概我知道的就这么多了,发现将正则说清楚好像挺难的,还是多总结,多提高吧!

 

 

 

 

 

 

 

posted on 2019-06-12 12:14  sunny-cheng  阅读(233)  评论(0)    收藏  举报