• Python爬虫教程-19-数据提取-正则表达式(re)


    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式

    Python爬虫教程-19-数据提取-正则表达式(re)

    • 正则表达式:一套规则,可以在字符串文本中进行搜查替换等
    • 正则使用步骤:
      • 1.使用 compile 函数将正则表达式的字符串编译成一个 pattern 对象
      • 2.通过 pattern 对象的一些方法对文本进行匹配,匹配结果是一个 match 对象
      • 3.用 match 对象的方法,对结果进行操作
    • 正则的常用方法:
      • match:从开始位置开始查找,一次匹配,即1次匹配成功则退出
      • search:从任何位置开始查找,一次匹配
      • findall:全部匹配,返回列表
      • finditer:全部匹配,返回迭代器
      • split:分割字符串,返回列表
      • sub:替换
    • 匹配中文
      • 中文是Unicode编码(utf-8也是Unicode编码),范围:主要在[u4e00-u9fa5]
      • 中文全角逗号一类的不在[u4e00-u9fa5]范围内
    • 贪婪与非贪婪模式
      • 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配
      • 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配
      • python里面数量词默认是贪婪模式
      • 例如:
        • 查找文本abbbbbbbccc
        • re结果是: ab*
        • 贪婪模式结果是:abbbbbbb
        • 非贪婪模式结果是:a

    案例v23 match的基本使用

    # 正则结果match的使用案例
    import re
    
    # 以下正则分成2个组,以小括号为单位
    # [a-z]表示出现小写a-z任意字母都可以,+表示至少出现1次
    # 两组之间有一个空格,表示匹配的两个英文字符之间有空格
    s = r"([a-z]+) ([a-z]+)"
    
    # 编译
    pattern = re.compile(s, re.I)  # s, I表示忽略大小写
    
    m = pattern.match("Hello world wide web")
    
    # group(0) 表示返回整个匹配成功的字符串,即所有小组
    s = m.group(0)
    print("所有小组的匹配结果:
    ", s)
    
    # 返回匹配成功的整个字符串的跨度,即所有小组
    a = m.span(0)
    print("所有小组的匹配结果跨度:
    ", a)
    
    # group(0) 表示返回的第一个分组匹配成功的字符串
    s = m.group(1)
    print("第1小组的匹配结果:
    ", s)
    
    # 返回匹配成功的整个字符串的跨度
    a = m.span(1)
    print("第1小组的匹配结果跨度:
    ", s)
    
    # groups() 打印出所有的小组,等价于m.group(1), m.group(2)...
    s = m.groups()
    print(s)
    

    运行结果

    这里写图片描述
    从结果可以看到:匹配到两个小组,一个Hello,一个world,中间的空格是外面的,代码中包含一些具体的输出格式

    案例v24 search的基本使用

    # search的基本使用
    
    import re
    
    s = r'd+'
    
    pattern = re.compile(s)
    
    # 无参数表示从头开始查找,到最后结束
    m = pattern.search("one12two34three56")
    print(m.group(0))
    
    # 参数表明搜查的范围,例如:10-40
    m = pattern.search("one12two34three56", 10, 40)
    print(m.group(0))
    

    运行结果

    这里写图片描述
    因为是从第10个开始查找,所以查到的是56

    案例v25 findall,finditer的基本使用

    # findall,finditer的基本使用
    import re
    
    s = r'd+'
    
    pattern = re.compile(s)
    
    m = pattern.findall("I am 18 years old, and 185 high")
    print(m)
    
    n = pattern.finditer("I am 18 years old, and 185 high")
    print(type(n))
    
    # 迭代器使用for循环输出
    for i in n:
        # 只输出i会包含无用数据
        print(i.group())
    

    运行结果

    这里写图片描述
    查找所有匹配的字符串

    匹配中文

    # 中文unicode案例
    
    import re
    
    hello = u'你好,再见陌生人'
    
    # 中文全角逗号一类的不在[u4e00-u9fa5]范围内
    pattern = re.compile(r'[u4e00-u9fa5]+')
    
    m = pattern.findall(hello)
    
    print(m)
    

    运行结果

    这里写图片描述
    因为中文全角逗号一类的不在[u4e00-u9fa5]范围内,所在 findall 返回的是一个列表,包含两个值

    更多文章链接:Python 爬虫随笔


    - 本笔记不允许任何个人和组织转载
  • 相关阅读:
    数据卷Volume
    使用 Elastic Stack 分析地理空间数据 (二)
    使用 Elastic Stack 分析地理空间数据 (一)
    如何在 Docker 之上使用 Elastic Stack 和 Kafka 可视化公共交通
    Kubernetes网络模型
    举例:Network Policies
    配置Pod的 /etc/hosts
    k8s上安装安装 Ingress Controller &卸载
    logstash安装插件修改使用的gem源
    示例:Ingress通过互联网访问应用
  • 原文地址:https://www.cnblogs.com/xpwi/p/9600916.html
Copyright © 2020-2023  润新知