ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式:贪婪匹配与非贪婪匹配

2021-07-06 14:31:12  阅读:198  来源: 互联网

标签:__ 匹配 正则表达式 模式 re json 贪婪


情景

之前写过一个简单的爬虫,每天获取公司insgtagram主页的粉丝数用来进行粉丝趋势的展示。代码很简单就是通过获取主页源代码后用正则表达式匹配其中的一串json数据,再用python的json解析库进行解析,从中获取粉丝数。

然而昨天这个爬虫报错了,我重新看了一下ins主页的网页源代码,发现其中增加了一段内容,这段内容正好被我匹配进去了。经过思考显而易见,这是贪婪匹配的问题。

贪婪匹配与非贪婪匹配

现在这些术语听起来都很吓人,其实这是正则匹配的两种模式,很容易解释:

  • 贪婪匹配:尽可能匹配最长的字符串
  • 非贪婪匹配: 尽可能匹配最短的字符串

举个例子:
aa<div>test1</div>bb<div>test2</div>cc

如果想要匹配一个完整的div,贪婪模式的结果为:
<div>test1</div>bb<div>test2</div>

非贪婪模式的结果为:
<div>test1</div>

可以发现贪婪模式会匹配尽可能长的字符串,而非贪婪模式在第一次匹配成功后就会停止匹配。

如何区分两种模式

默认情况下匹配都是贪婪模式,如果要改成非贪婪模式,只需要量词后面加上一个问号?。

常用的量词有:

  • {m,n}
  • {m,}
  • ?
  • *
  • +

这些默认都是贪婪模式,若改成非贪婪模式,只需这样:

  • {m,n}?
  • {m,}?
  • ??
  • *?
  • +?

针对上面那个div的例子,贪婪模式的匹配表达式为:
<div>.*</div>

非贪婪模式的匹配表达式为:
<div>.*?</div>

总结

贪婪模式就是匹配最长的字符串,非贪婪模式就是匹配最短字符串。

默认情况下匹配都是贪婪模式,如果要改成非贪婪模式,只需要量词后面加上一个问号?。

使用贪婪模式还是非贪婪模式,这主要取决于我们的需求。但有一点,非贪婪模式的性能一定是高于贪婪模式的。

最后,附上我的爬虫代码:

# -*- coding: UTF-8 -*-
import json
import requests
import re

def get_by_request():
    username = 'insta360official'
    url = 'https://www.instagram.com/' + username + '/'
    response = requests.get(url=url, verify=False)
    page = response.text
    pattern = re.compile("window._sharedData = (.*?);</script>", re.S)
    items = re.findall(pattern, page)
    jsonData = json.loads(items[0])
    count = jsonData['entry_data']['ProfilePage'][0]['user']['followed_by']['count']
    print count
    return count

if __name__ == "__main__":
    get_by_request()

标签:__,匹配,正则表达式,模式,re,json,贪婪
来源: https://blog.csdn.net/u012206617/article/details/118519502

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有