zoukankan      html  css  js  c++  java
  • 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 爬虫随笔


    - 本笔记不允许任何个人和组织转载
  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/xpwi/p/9600916.html
Copyright © 2011-2022 走看看