日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式:贪婪匹配与非贪婪匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

情景

之前寫過一個簡單的爬蟲,每天獲取公司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()

總結

以上是生活随笔為你收集整理的正则表达式:贪婪匹配与非贪婪匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。