Python爬虫-解析网页之Re库


解析网页之使用Re库解析网页

在python中,可用Re库使用表达正则表达式,所以我们先简单介绍一下正则表达式

1 正则表达式

1.1 正则表达式的表示类型

  • 在Python中,采用raw string类型[1]表示正则表达式

  • 表示为:

    r'text'
    
    • 例如:

      r'[1-9]\d{5}'
      

1.2 正则表达式元字符

? 正则表达式右普通字符和元字符组成。普通字符表示自身;元字符有特殊含义

常用正则表达式元字符

类别 元字符 功能描述 例子
数量限定符 * 匹配前面0个或者多个字符 "ab*"可匹配"a"、"b"或"abc"等
+ 匹配前面1个或多个字符 "ab+"可匹配"ab"、"abb"等
匹配前面0个或者1个字符 "ab?"可匹配"a"或"ab",但不可匹配"abb"
{n} 匹配前面的字符n次 "ab{3}"可匹配"abbb",但不可匹配"ab"或"abb"
{n,} 匹配前面的字符至少n次 "ab{3,}"可匹配"abbb"或"abbbbb",但不可匹配"ab"或"abb"
{n,m} 匹配前面的字符至少n次,至多m次 "ab{3,4}可匹配"abbb"或"abbbb",但不可匹配"ab"或"abb"
字符限定符 [] 定义一个字符集,用于匹配字符集内任一字符 "[abcd]"可匹配"a"、"b"或"c"
[^] 定义一个字符集,用于匹配字符集外的任一字符 "[ ^ abcd]"可匹配任一非小写元音字母的字符
[-] 定义一个字符,用于匹配字符集内任一字符 "[a-z]"可匹配任一小写字母的字符
[^-] 定义一个字符集,用于匹配字符集外任一字符 "[ ^ a-z]"可匹配任一非小写字母的字符
\d 匹配任一数字字符,等价于[0-9]
\D 匹配任一非数字字符,等价于[ ^ 0-9]
\w 匹配任一数字字母字符,等价于[0-9A-Za-z]
\W 匹配任一非数字字母字符,等价于[ ^ 0-9A-Za-z]
\s 匹配任一空白字符,等价于[\v\t\n\r\f]
\S 匹配任一非空白字符,等价于[ ^ \t\n\r\f]
. 匹配换行符(\n)之外的任一字符
定位符 ^ 匹配目标字符的开头
$ 匹配目标字符的结尾
\b 匹配单词的边界(单词与空格之间的位置)通俗来讲就是单词结尾。
\B 匹配非单词的边界

常用元字符

元字符 作用 例子
圆括号"( )" 作为分组符使用,将括号中的内容定义为一个组并将该表达式的字符保存到一个临时区域。通俗来讲就是把括号内的内容看成一个整体。经常与+*?连续使 用,表示对(…)部分进行重复。 "(ab){3}"可以匹配"ababab"
竖线"|" 作为选择匹配符使用,用来对两个匹配条件进行逻辑或运算。通俗来讲就是匹配左右表达式任意一个。 "com|net|org"可以匹配"com"、"net"或"org"
反斜杠" \ " 作为转义符使用 "\n"用于匹配换行符," \ \ "用于匹配反斜杠

1.3 正则表达式测试网站

  • https://regex101.com/

1.4 常用正则表达式

  • 匹配中文字符:[\u4e00-\u9fa5]

  • 网址(URL):[a-zA-z]+://[^\s]*

  • QQ号码:[1-9]\d{4,}

2 Re库

re库主要用于字符串匹配,使用raw string类型来表达正则表达式

  • 调用Re库

    import re
    
    • Re是python标准库
  • 使用Re函数的格式

    Re库函数(pattern,string,flags=0)
    
    • pattern:表示正则表达式的字符或raw string
    • string:待匹配的字符
    • flags:正则表达式使用时的控制标记

2.1 Re库常用函数

函数 说明
re.search() 扫描整个字符串,只返回第一个成功的匹配。返回的是match对象
re.match() 从整个字符串初始位置开始匹配,如果不是起始位置着返回none。返回的是match对象
re.findall() 搜索字符串,以列表返回能全部匹配的子串
re.split() 将一个字符串安装正则表达式匹配的结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在字符串中替换所有正则表达式的子串,返回替换后的字符串

2.2 Match对象的方法

  • Match 对象(Object)是什么

    • Match对象是包含有关搜索和结果信息对象

      • 如果没有匹配项,则将返回值None,而不是Match Object。

        • 例如:

          import re
          txt = "Hello World"
          x = re.search("1", txt)
          print(x) #输出的是一个对象
          
          None
          
    • Match对象具有用于检索有关搜索信息的属性和方法

  • Match对象的方法

    • 方法 说明
      .group(0) 获取匹配后的字符串。0参数表示
      .start() 匹配字符串在原始字符串的开始位置
      .end() 匹配字符串在原始字符串的结束位置
      .span() 返回(.start(),end())
      • match.group()加餐:

        1. 不含参数的时候,返回整个匹配对象
        2. 含有一个参数的时候,返回参数对应分组的对象
        3. 含有多个参数的时候,以元组的形式返回参数对应的分组
        import re
        m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
        print(m.group(0))		# The entire match
        print(m.group(1))       # The first parenthesized subgroup.
        print(m.group(2))       # The second parenthesized subgroup.
        print(m.group(1, 2))    # Multiple arguments give us a tuple.
        ('Isaac', 'Newton')
        
        Isaac Newton
        Isaac
        Newton
        ('Isaac', 'Newton')
        

  1. raw string(原生字符串类型):就是不包含转义字符再次转义的字符串 ??