gockk

正则表达式

  • 什么是正则表达式
    • 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
  • 正则表达式的使用场景
    • 判断一个字符串是否符合规则。
    • 取出制定数据
    • 爬虫岗位较为核心的技术
    • 彩票网站匹配彩票信息
  • 正则表达式模块re的用法
    • re模块使Python语言拥有全部的正则表达式功能。

re.match函数

  • re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()返回none.

  • 函数语法:

    • re.match(pattern,string,flags=0)
      
  • 函数参数说明:

    • 参数 描述
      pattern 匹配的正则表达式
      string 要匹配的字符串
      flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
    • import re
      
      #在起始位置匹配
      print(re.match(\'www\',\'www.ckk.com\').span()) #(0,3)
      #不在起始位置匹配
      print(re.match(\'com\',\'www.runoob.com\')) #None
      
  • 匹配成功re.match方法返回一个匹配的对象,否则返回None。

  • 我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。

    • import re
      
      line = "Cats are smarter than dogs"
      # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
      # (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
      matchObj = re.match(r\'(.*) are (.*?) .*\', line, re.M | re.I)
      
      if matchObj:
          print("matchObj.group() : ", matchObj.group())  #matchObj.group() :  Cats are smarter than dogs
          print("matchObj.group(1) : ", matchObj.group(1))#matchObj.group(1) :  Cats
          print("matchObj.group(2) : ", matchObj.group(2))#matchObj.group(2) :  smarter
      else:
          print("No match!!")
      
      

re.search方法

  • re.search扫描整个字符串并返回第一个成功的匹配

  • 函数语法:

    • re.search(pattern,string,flags=0)
      
  • 函数参数说明:

    • 参数 描述
      pattern 匹配的正则表达式
      string 要匹配的字符串
      flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
  • 匹配成功re.search方法返回一个匹配的对象,否则返回None。

  • 我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。

    • 匹配对象方法 描述
      group(num=0) 匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含哪些组所对应值的元组。
      groups() 返回一个包含所有小组字符串的元组,从1到所含的小组号。
  • 示例代码:

    • import re
      
      #在起始位置匹配
      print(re.search(\'www\',\'www.ckk.com\'.span()) #(0,3)
      #不在起始位置匹配
      print(re.search(\'com\',\'www.ckk.com\'.span()) #(11,14)
      
    • import re
       
      line = "Cats are smarter than dogs"
       
      searchObj = re.search( r\'(.*) are (.*?) .*\', line, re.M|re.I)
       
      if searchObj:
         print ("searchObj.group() : ", searchObj.group())#
         print ("searchObj.group(1) : ", searchObj.group(1))
         print ("searchObj.group(2) : ", searchObj.group(2))
      else:
         print ("Nothing found!!")
        
      \'\'\'
      searchObj.group() :  Cats are smarter than dogs
      searchObj.group(1) :  Cats
      searchObj.group(2) :  smarter
      \'\'\'
      
  • re.match与re.search的区别

    • re.math只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None,而re.search匹配整个字符串,直到找到一个匹配。

检索和替换

  • Python的re模块提供了re.sub用于替换字符串中的匹配项。

  • 语法:

    • re.sub(pattern,repl,string,count=0,flags=0)
      
  • 参数:

    • pattern:正则中的模式字符串。
    • repl:替换的字符串,也可为一个函数、
    • string:要被查找替换的原始字符串
    • count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
    • flags:编译时用的匹配模式,数字形式。
    • 前三个为必选参数,后两个为可选参数
  • 示例代码

    • import re
       
      phone = "2004-959-559 # 这是一个电话号码"
       
      # 删除注释
      num = re.sub(r\'#.*$\', "", phone)
      print ("电话号码 : ", num)#电话号码 :  2004-959-559 
       
      # 移除非数字的内容
      num = re.sub(r\'\D\', "", phone)
      print ("电话号码 : ", num)#电话号码 :  2004959559
      
  • repl参数是一个函数

    • import re
       
      # 将匹配的数字乘于 2
      def double(matched):
          value = int(matched.group(\'value\'))
          return str(value * 2)
       
      s = \'A23G4HFD567\'
      print(re.sub(\'(?P<value>\d+)\', double, s))#A46G8HFD1134
      
      

compile函数

  • compile函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供match()和search()这两个函数使用。

  • 语法格式为:

    • re.compile(pattern[,flags])
      
  • 参数:

    • pattern:一个字符串形式的正则表达式
    • Flags:可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    • re.l忽略大小写
      • re.L:表示特殊字符集\w,\W,\b,\B,\s,\S依赖于当前环境
      • re.M:多行模式
      • re.S:即为’.‘并且包括换行符在内的任意字符(\'.\'不包括换行符)
      • re.U:表示特殊字符集\w,\W,\b,\B,\s,\S依赖于Unicode字符属性数据库
      • re.X:为了增加可读性,忽略空格和\'#\'后面的注释
  • 示例代码:

    • >>>import re
      >>> pattern = re.compile(r\'\d+\')                    # 用于匹配至少一个数字
      >>> m = pattern.match(\'one12twothree34four\')        # 查找头部,没有匹配
      >>> print( m )
      None
      >>> m = pattern.match(\'one12twothree34four\', 2, 10) # 从\'e\'的位置开始匹配,没有匹配
      >>> print( m )
      None
      >>> m = pattern.match(\'one12twothree34four\', 3, 10) # 从\'1\'的位置开始匹配,正好匹配
      >>> print( m )                                        # 返回一个 Match 对象
      <_sre.SRE_Match object at 0x10a42aac0>
      >>> m.group(0)   # 可省略 0
      \'12\'
      >>> m.start(0)   # 可省略 0
      3
      >>> m.end(0)     # 可省略 0
      5
      >>> m.span(0)    # 可省略 0
      (3, 5)
      
  • 在上面,当匹配成功时返回一个match对象,其中:

    • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()group(0)
    • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
    • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
    • span([group]) 方法返回 (start(group), end(group))

findall

  • 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

  • 注意:

    • match和search是匹配一次。
    • findall匹配所有
  • 语法格式为:

    • re.findall(pattern,string,flags=0)
      或者
      pattern.findall(string[,pos[,endpos]])
      
  • 参数:

    • pattern:匹配模式
    • string:待匹配的字符串
    • pos:可选参数,指定字符串的起始位置,默认为0
    • endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。
  • 查找字符串中的所有数字:

    • import re
       
      result1 = re.findall(r\'\d+\',\'runoob 123 google 456\')
       
      pattern = re.compile(r\'\d+\')   # 查找数字
      result2 = pattern.findall(\'runoob 123 google 456\')
      result3 = pattern.findall(\'run88oob123google456\', 0, 10)
       
      print(result1)#[\'123\', \'456\']
      print(result2)#[\'123\', \'456\']
      print(result3)#[\'88\', \'12\']
      

re.finditer

  • 和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

    • re.finditer(pattern,string,flags=0)
      
  • 参数:

    • 参数 描述
      pattern 匹配的正则表达式
      string 要匹配的字符串
      flags 标志位,用于控制正则表达式的匹配方式。
  • 示例代码:

    • import re
       
      it = re.finditer(r"\d+","12a32bc43jf3") 
      for match in it: 
          print (match.group() )
          
      \'\'\'
      12
      32
      43
      3
      \'\'\'
      

re.split

  • split方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下

    • re.split(pattern,string[,maxsplit=0,flags=0])
      
  • 参数:

    • 参数 描述
      pattern 匹配的正则表达式
      string 要匹配的字符串
      maxsplit 分割次数,maxsplit=1 分割一次,默认为0,不限制次数。
      flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:[正则表达式修饰符 - 可选标志]
  • 示例代码

    • >>>import re
      >>> re.split(\'\W+\', \'runoob, runoob, runoob.\')
      [\'runoob\', \'runoob\', \'runoob\', \'\']
      >>> re.split(\'(\W+)\', \' runoob, runoob, runoob.\') 
      [\'\', \' \', \'runoob\', \', \', \'runoob\', \', \', \'runoob\', \'.\', \'\']
      >>> re.split(\'\W+\', \' runoob, runoob, runoob.\', 1) 
      [\'\', \'runoob, runoob, runoob.\']
       
      >>> re.split(\'a*\', \'hello world\')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
      [\'hello world\']
      

正则表达式对象

  • re.RegexObject
    • re.compile()返回RegexObject对象。
  • re.MatchObject
  • group()返回被RE匹配的字符串
    • start():返回匹配开始的位置
    • end():返回匹配结束的位置
    • span():返回一个元组包含匹配(开始,结束)的位置

正则表达式修饰符--可选标志

  • 正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR()它们来指定。如re.l。re.M被设置成I和M标志:

  • image-20210909145549991

  • 正则表达式模式

    • 模式字符串使用特殊的语法来表示一个正则表达式。
    • 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
    • 多数字母和数字前加一个反斜杠时会拥有不同的含义。
    • 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
    • 反斜杠本身需要使用反斜杠转义。
    • 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r\'\t\',等价于 \t )匹配相应的特殊字符。
    • 下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
    • image-20210909150451356

image-20210909150516938

正则表达式实例

  • 字符匹配

  • 实例 描述
    python 匹配 "python".
  • 字符类

    • image-20210909150607052
  • 特殊字符类

    • image-20210909150736932

分类:

技术点:

相关文章: