Python爬虫实践 ——— Regular Expressions Python re模块

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

(1)re.match 函数

  match函数

  从字符串起始位置匹配一个模式。

  语法: re.match(pattern, string, flags=0)

    parttern 匹配模式 string 要匹配的字符串 flag 限定修正符re.i re.g re.m

(2)re.search 函数

  search函数

  扫描整个字符串并返回第一个成功的匹配。

  语法:re.search(pattern, string, flags=0)

    parttern 匹配模式 string 要匹配的字符串 flag 限定修正符re.i re.g re.m

                    ****** re.match与re.search的区别 ******

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

 (3)re.sub函数

  sub函数

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

  语法:re.sub(pattern, repl, string, count=0, flags=0)

  parttern 匹配模式  repl : 替换的字符串,也可为一个函数

  string 要匹配的字符串 count  模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。flag 限定修正符 re.i re.g re.m

    例:

      1. # repl为替换字符串,除去 “#”号 后面的注释

      phone = "2004-959-559 # 这是一个电话号码"

      num = re.sub(r'#.*$', "", phone)

      print ("电话号码 : ", num)

        >>>电话号码 : 2004-959-559

      2. # repl为函数,将匹配的字符串内的数字乘于 2,捕获组别名引用

      def double(matched):

        value = int(matched.group('value'))

        return str(value * 2)

      s = 'A23G4HFD567'

      print(re.sub('(?P<value>\d+)', double, s))  # 别名引用匹配模式,别名为value

      >>>A46G8HFD1134

      3.捕获组可下标标号引用

      p = re.compile(r'(\d+)abcd(\d+)')

      result = re.sub(p, r'\2invert\1', '12345abcd67890') # 数组下标引用匹配模式,\1 是第一个匹配到的数字组

      print(result)

      >>> 67890invert12345

(4)re.complie 函数

  complie函数

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

  语法:re.compile(pattern[, flags])

(5)re.findall 函数

  findall函数

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

  语法:re.findall(string[, pos[, endpos]])

  string 待匹配的字符串,可设置匹配起始位置。

(6)re.spilt 函数

  spilt函数

  split 方法按照能够匹配的子串将字符串分割后返回列表。

  语法:re.split(pattern, string[, maxsplit=0, flags=0]) 

  maxsplit为分隔次数 1分隔一次,默认为 0,不限制次数。

  对于一个找不到匹配的字符串而言,split 不会对其作出分割

(7)正则表达式对象、分组与匹配方法

  正则表达式对象

    re.RegexObject

      re.compile() 返回 RegexObject 对象。

    re.MatchObject

      . match() 和 . search() 可返回 MatchObject对象。

      group() 返回被 RE 匹配的字符串。

        . start() 返回匹配开始的位置

        . end() 返回匹配结束的位置

        . span() 返回一个元组包含匹配 (开始,结束) 的位置

  re.compile 为RegexObject编译对象,可以由re.compile(r'模式不用转义')获得。

    可以接.match()或 .search()方法获得MatchObject对象,或者.finditer()方法可获得包括MathObject元素的迭代器,

    还可接.findall()获得匹配串列表 (list)

  MatchObject对象可以通过以下方法访问内容:

     .group()  == .group(0) 返回匹配模式成功的整个子串

    . group(n) 返回第n个分组匹配成功的子串

    . span(0) 返回匹配成功的整个子串的起始位置索引

    . span(n) 返回返回第n个分组匹配成功的子串起始位置索引

    .start(0) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0

    . end(0) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0

    .groups() 返回匹配所有分组成功的各个子串的元组表示

  

  findall函数匹配规则及结果:

    注意: match 和 search 是匹配一次 findall 匹配所有。

    1.已匹配成功的字符串,不在参与下次匹配

      示例:r=re.findall("\d+\w\d+","a2b3c4d5")  >>> ['2b3', '4d5']   # 3c4不会重复参与匹配

    2.无匹配规则返回的是一个比原始字符串多一位的空字符串列表

      示例:r=re.findall("","a2b3c4d5")  >>> ['', '', '', '', '', '', '', '', ''] # 9 字符空串

    3.组匹配时尽量避免用*否则会有可能匹配出空字符串

      示例:r=re.findall("(ca)*","ca2b3caa4d5")  >>> ['ca', '', '', '', 'ca', '', '', '', '', ''] # 用*号会匹配出空字符

    4.无分组匹配:匹配所有合规则的字符串,匹配到的字符串放到一个列表中。单 | 符号不属于分组匹配

      示例:r=re.findall("a\w+","ca2b3 caa4d5") >>> ['a2b3', 'aa4d5'] # 匹配所有合规则的字符串,匹配到的字符串放入列表

    5.有分组匹配:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法

      示例:r=re.findall("a(\w+)","ca2b3 caa4d5") >>> ['2b3', 'a4d5'] # 返回匹配到组里的内容返回

    6.多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返回

      示例:r=re.findall("(a)(\w+)","ca2b3 caa4d5") >>> [('a', '2b3'), ('a', 'a4d5')] # 返回的是多维数组

    7.分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,

     把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回

      示例:r=re.findall("(a)(\w+(b))","ca2b3 caa4b5") >>> [('a', '2b', 'b'), ('a', 'a4b', 'b')] # 返回的是多维数组

    8. ?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串。

      示例:r=re.findall("a(?:\w+)","a2b3 a4b5 edd") >>> ['a2b3', 'a4b5'] # ?:在有分组的情况下,不只拿分组里的字符串,拿所有匹配到的字符串

(8)字符串分割和替换

  

字符串分割

  line = 'aaa bbb ccc;ddd eee,fff'

  单字符分割

  >>> re.split(r';',line)

  ['aaa bbb ccc', 'ddd\teee,fff']

  两个字符以上切割需要放在 [ ]中

  >>> re.split(r'[;,]',line)

  ['aaa bbb ccc', 'ddd\teee', 'fff']

  所有空白字符切割

  >>> re.split(r'[;,\s]',line)

  ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']

  

  使用括号捕获分组,默认保留分割符

     >>> re.split(r'([;])',line)

  ['aaa bbb ccc', ';', 'ddd\teee,fff']

  

  不想保留分隔符,以(?: ...)的形式指定

  >>> re.split(r'(?:[;])',line)

  ['aaa bbb ccc', 'ddd\teee,fff']

 字符串替换

  两种表现内编组分组引用 \g<name>和\g<n>

  方式1:没有用表现内方式,结果为把better丢失

  

  方式2:使用了表现内方式,把原来内容保留下来把better保留下来了

  

  方式3:在方式2的基础上,把序号改为分组名称

  

  sub可以替换的时候,把匹配到的分组内容组内引用进行互换

  

  subn替换并返回替换数量

  

(9)模块级别操作

  re.purge()清理正则缓存和re.escape()逃逸字符

  正则在模式编译时候,编译好的模式会缓存到内存中,如果想某个时间清空之前的缓存,可以使用purge方法

  逃逸字符,忽略以前原有的功能意义如行开始标志^、或行结尾标志$、问号等

    例如:文本里面本身含有^,如果想匹配该字符

    

本文搬运转载总结自

菜鸟教程 Python3正则表达式教程

https://www.runoob.com/python3/python3-reg-expressions.html

简书 全栈coder Python 中re.split()方法

https://www.jianshu.com/p/41939d338ccb

博客园 艺杰兮 python系列教程等

https://www.cnblogs.com/yijiexi/p/11165257.html

https://www.cnblogs.com/yijiexi/p/11165306.html

https://www.cnblogs.com/yijiexi/p/11165337.html

https://www.cnblogs.com/yijiexi/p/11165387.html

猜你喜欢

转载自www.cnblogs.com/liuchaodada/p/12126545.html