zoukankan      html  css  js  c++  java
  • Re正则表达式

    一、介绍

    在爬虫数据解析中有三种解析方式

      1、re解析 #运行速度最快、效率高、准确性搞。 但是上手难度高

      2、bs4解析 #代码简单、但执行效率不高

      3、xpath解析 #语法简单,容易上手

    注:在线正则表达式:https://tool.oschina.net/regex

    二、符号表达式

    1   .       匹配除换行符以外的所有字符
    2   \w      匹配字符或数字或下划线
    3   \s      匹配任意的空白字符
    4   \d      匹配数字
    5   \n      匹配一个换行符
    6   \t      匹配一个制表符
    7
    8   ^       匹配字符串的开始
    9   $       匹配字符串的结尾
    10
    11  \W      匹配非字符或数字或下划线
    12  \D      匹配非数字
    13  \S      匹配非空白字符
    14  a|b     匹配字符a或者字符b
    15  ()      匹配括号内的表达式,也表示一个组
    16  [...]   匹配字符组中的字符
    17  [^...]  匹配除了字符组中字符的所有字符

    三、量词:控制前面的元字符出现的次数

    1   *       重复零次或更多次
    2   +       重复一次或更多次
    3   ?       重复零次或者1次
    4   {n}     重复n次
    5   {n,}    重复n次或更多次
    6   {m,n}   重复md到n次

    四、贪狼匹配和惰性匹配

    1   .*      贪狼匹配
    2   .*?     惰性匹配,# 在爬虫中使用较多

    #实例:
    s1 = '玩儿吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏啊'

    print('贪狼模式:',re.findall(r'玩儿.*游戏',s1))
    print('惰性模式:',re.findall(r'玩儿.*?游戏',s1))

    结果:

      

    五、常规使用

     1、findall:匹配字符串中所有的符合正则的内容,返回list

    li = re.findall(r"\d+","我的电话是10086,我女朋友的电话是10010")
    print(li)

    结果:  

      

    2、finditer:匹配字符串中所有的内容,返回迭代器,从迭代器中拿到内容需要 .group()

    rest = re.finditer(r"\d+","我的电话是10086,我女朋友的电话是10010")
    for it in rest:
        print("电话:",it.group())

    结果:

      

    3、search:全文检索,找到一个结果就返回。返回Match对象,拿数据需要 .gruop()

    rest = re.search(r"\d+","我的电话是10086,我女朋友的电话是10010")
    print(rest.group())

    结果:

      

    4、match:从头开始匹配,返回Match对象。拿数据需要 .gruop()

    rest = re.match(r"\d+","10086我的电话是10086,我女朋友的电话是10010")
    print(rest.group())

    结果:

      

    5、预加载正则表达式, re.S:让 . 能匹配换行符

      obj = re.compile(r"<div class = '.*?'><span id = '\d+'>.*?</span></div>",re.S)

    6、通过(?P<name>正则表达式),提取想要的内容到name中

    s = '''
    <div class = 'jay'><span id = '1'>土豆</span></div>
    <div class = 'jj'><span id = '2'>地瓜</span></div>
    <div class = 'sda'><span id = '3'>红薯</span></div>
    <div class = 'fbd'><span id = '4'>山药</span></div>
    <div class = 'sde'><span id = '5'>白菜</span></div>
    '''
    
    re_obj1 = re.compile(r"<div class = '(?P<name>.*?')><span id = '(?P<id>\d+)'>(?P<nr>.*?)</span></div>",re.S)
    res1 = re_obj1.finditer(s)
    for it in res1:
        print(it.group("name"),'---',it.group("id"),'---',it.group("nr"))

    结果:

      

    IT运维开发路上的点点滴滴。。。
  • 相关阅读:
    简单的JS控制button颜色随点击更改
    以 “月” 为单位的可以翻页的效果 显示为 2016年01月
    荷兰国旗 Flag of the Kingdom of the Netherlands
    最大连续子数组以及拓展
    Something Wrong or Something Right
    转载文章----十步完全理解SQL
    数据库关系代数练习题
    SQL server 2014安装以及解决连接数据库失败问题
    回文判断
    字符串的包含
  • 原文地址:https://www.cnblogs.com/weijie0717/p/15763651.html
Copyright © 2011-2022 走看看