14.网络爬虫—数据提取2-正则表达式规则详讲
作者:mmseoamin日期:2024-04-29

14.网络爬虫—数据提取2-正则表达式规则详讲

  • 摘要
  • 正则表达式常见规则
  • 数量词的贪婪模式与非贪婪模式
  • 常用方法
  • 正则表达式修饰符 - 可选标志

    摘要

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了。

    14.网络爬虫—数据提取2-正则表达式规则详讲,在这里插入图片描述,第1张

    正则表达式常见规则

    模式描述
    ^匹配字符串的开头
    $匹配字符串的末尾
    .匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
    […]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
    [^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符
    re*匹配0个或多个的表达式
    re+匹配1个或多个的表达式
    re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
    re{ n}
    re{ n,}精确匹配n个前面表达式
    re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
    ab
    (re)G匹配括号内的表达式,也表示一个组
    (?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域
    (?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域
    (?: re)类似 (…), 但是不表示一个组
    (?imx: re)在括号中使用i, m, 或 x 可选标志
    (?-imx: re)在括号中不使用i, m, 或 x 可选标志
    (?#…)注释
    (?= re)前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
    (?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
    (?> re)匹配的独立模式,省去回溯
    \w匹配字母数字及下划线
    \W匹配非字母数字及下划线
    \s匹配任意空白字符,等价于 [\t\n\r\f].
    \S匹配任意非空字符
    \d匹配任意数字,等价于 [0-9]
    \D匹配任意非数字
    \A匹配字符串开始
    \Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
    \z匹配字符串结束
    \G匹配最后匹配完成的位置
    \b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
    \B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’
    \n, \t, 等.匹配一个换行符。匹配一个制表符。等
    匹配第n个分组的内容
    匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式
    [\u4e00-\u9fa5]中文

    数量词的贪婪模式与非贪婪模式

    数量词的贪婪模式与非贪婪模式是正则表达式中两种不同的匹配方式。

    1. 贪婪模式(Greedy):默认情况下,正则表达式中的数量词会尽可能多地匹配字符。例如,在正则表达式"a.*b"中,点号和星号组合表示匹配任意数量的任意字符,包括零个或多个字符。由于贪婪模式的特性,它会一直匹配到最后一个满足条件的字符,即直到找到最后一个"b"为止。

    示例代码:

    import re
    text = "abcdefg"
    pattern = r'a.*b'
    matches = re.findall(pattern, text)
    print("匹配结果:", matches)
    

    输出结果为:['abcdefg']

    1. 非贪婪模式(Non-greedy):通过在数量词后面加上问号"?",可以将其转换为非贪婪模式。非贪婪模式会尽可能少地匹配字符,即在满足条件的情况下尽早结束匹配。

    示例代码:

    import re
    text = "abcdefg"
    pattern = r'a.*?b'
    matches = re.findall(pattern, text)
    print("匹配结果:", matches)
    

    输出结果为:['ab']

    在上述示例中,使用贪婪模式时,正则表达式会一直匹配到最后一个"b",而使用非贪婪模式时,它会在第一个"b"处停止匹配。

    总结:

    • 贪婪模式是正则表达式中数量词的默认匹配方式,它会尽可能多地匹配字符。
    • 非贪婪模式通过在数量词后面加上问号"?"来指定,它会尽可能少地匹配字符。
    • 在实际应用中,根据具体需求选择贪婪模式或非贪婪模式进行匹配。

      常用方法

      以下是关于正则表达式的函数及其相关代码:

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

      import re
      pattern = r'\d+'  # 匹配数字
      string = 'abc123def456'
      result = re.match(pattern, string)
      if result:
          print("匹配成功:", result.group())
      else:
          print("匹配失败")
      

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

      import re
      pattern = r'\d+'  # 匹配数字
      string = 'abc123def456'
      result = re.search(pattern, string)
      if result:
          print("匹配成功:", result.group())
      else:
          print("匹配失败")
      

      3. re.sub:替换字符串。

      import re
      pattern = r'\d+'  # 匹配数字
      replace = 'X'
      string = 'abc123def456'
      result = re.sub(pattern, replace, string)
      print("替换后的字符串:", result)
      

      4. re.findall:查找全部。

      import re
      pattern = r'\d+'  # 匹配数字
      string = 'abc123def456'
      result = re.findall(pattern, string)
      print("匹配到的数字:", result)
      

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

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

      修饰符描述
      re.I使匹配对大小写不敏感
      re.L做本地化识别(locale-aware)匹配
      re.M
      re.S使 . 匹配包括换行在内的所有字符
      re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B
      re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解