Python正则表达式学习笔记

  发布日期:   2017-08-21
  最新修改:   2020-06-24
  阅读次数:   33 次

一、前言:

  • 正则表达式的作用很多,如:爬虫中抽取数据、网站验证、日志分析、数据匹配等等,当先,现在的人工智能等也离不开正则表达式的使用。
  • 换成一句话,正则就是对文本的处理。

二、Python正则表达式

  • Python正则表达式的能力来源于 re 模块,模块提供 Perl 风格的正则表达式模式。
  • re 模块使 Python 语言拥有全部的正则表达式功能。

三、正则的学习

re.macth函数

  • re.match 函数将尝试从字符串的起始位置开始匹配,如果不是起始位置匹配成功的话,match()就返回none。

  • 使用语法为:re.match(pattern, string, flags=0)

  • 参数说明:

    1、pattern : 匹配的正则表达式 2、string : 要匹配的字符串 3、flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

  • OK,我们通过代码来学习

      print(re.match('www','www.catbro.cn'))
    
      print(re.match('www','wWW.catbro.cn'))
    
      print(re.match('www','wWW.catbro.cn',re.RegexFlag.IGNORECASE))
    
      print(re.match('www1','www.catbro.cn'))
    
      print(re.match('cn','www.catbro.cn'))
  • 运行结果:

      <_sre.SRE_Match object; span=(0, 3), match='www'>
      None
      None
  • 从结果可以看到 :

    1、如果从其实位置开始能匹配到的,其返回的是一个对象; 2、由于我们第二个中w存在大小,默认匹配模式是不忽略大小写的,所以匹配不到。 3、由于我们重置匹配模式为忽略大小写,所以又可以找到来哦,所以小伙伴们可以根据实际需求进行修改哦。 4、最后两个匹配不到返回None;其中虽然 cn 确实是www.catbro.cn上的,但是按从字符串开始位置进行匹配,也是匹配不到的哦。


  • Ok,我们从上面的例子学习来match函数的使用,也知道其匹配到后返回的是一个对象,匹配不到返回None
  • 假如一些文章的格式已经固定了,我想获取里面的某部分内容,可不可以呢?
  • 当然可以,这样的情景更多在网络爬虫、数据分析提取中出现。
  • 此时我们需要用到一个函数

match.group(num=0)或者match.groups() 函数获取匹配表达式。

  • group(num=0) : 其匹配整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

  • groups() : 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

  • OK,在贴代码前,首先说一下,我们在正则表达式中通过使用 ()来确定目标数据

  • 代码修改如下:

      line = "Hello, I am 安杰小生,我的博客是www.catbro.cn"
    
      m =  re.match(r'.* am (.*),我的博客是(.*)',line,re.IGNORECASE);
      if m is not None :
          print(m.group())
          print(m.groups())
          #取出第一个()的数据
          print(m.group(1))
          #取出第二个()的数据
          print(m.group(2))
    
      else:
          print('我什么都找不到~~')
  • 结果输出如下:

      Hello, I am 安杰小生,我的博客是www.catbro.cn
      ('安杰小生', 'www.catbro.cn')
      安杰小生
      www.catbro.cn
  • 我们可以看到,group返回的是匹配到的字符串,groups则以元组的形式存储我们的匹配结果。

  • 还有一点要注意,groups的结果只会包含用()括起来的数据,group则还包括了整个负责正则表达式规则的数据

  • 通过group形式,我们可以传入()的需要拿到我们要的目标数据。

  • 还有一点要注意,我们编写正则表达式是,字符串前用了 r,为什么呢,这样是表示正则表达式字符串是原始类型的字符串,原始字符串时python解析器不会对内部的特殊字符进行转译,减少不必要的麻烦


  • 前面我们说match只会从字符串最左边开始进行匹配,一旦匹配不到就会返回None,但是,我只关心中间的或者最右边的数据,那该怎么办呢?

search函数:其扫描整个字符串,并返回第一个成功匹配的字符串

  • 使用语法为:re.search(pattern, string, flags=0),参数与match一样。

  • OK,我们修改一下示例代码:

      print(re.search('www','www.catbro.cn',re.IGNORECASE))
    
      print(re.search('catbro','wWW.catbro.cn',re.IGNORECASE))
    
      print(re.search('cn','www.catbro.cn',re.IGNORECASE))
  • 运行结果如下:

      <_sre.SRE_Match object; span=(0, 3), match='www'>
      <_sre.SRE_Match object; span=(4, 14), match='catbro'>
      <_sre.SRE_Match object; span=(15, 17), match='cn'>
  • Ok,可以看到,使用search可以满足我们的需求了。

re.match与re.search的区别

  • re.match只会匹配字符串的开始,如果字符串开始就不符合正则表达式,则说明匹配失败,函数返回None;
  • re.search匹配的是整个字符串

五、总结

  • 到这里我们就学习了python中正则表达式的简单使用,正则是很强大的一个工具,我们将在后面篇幅继续学习正则表达式在python中的使用知识

   转载规则

《Python正则表达式学习笔记字》GajAngels 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。