正则表达式:贪婪匹配与非贪婪匹配
情景
之前寫過一個簡單的爬蟲,每天獲取公司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 redef get_by_request():username = 'insta360official'url = 'https://www.instagram.com/' + username + '/'response = requests.get(url=url, verify=False)page = response.textpattern = 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 countreturn countif __name__ == "__main__":get_by_request()總結
以上是生活随笔為你收集整理的正则表达式:贪婪匹配与非贪婪匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何选择SSL 证书服务
- 下一篇: jenkins未授权访问漏洞记录(端口: