正規表現の貪欲マッチングと非貪欲マッチング

2302 ワード

シナリオ
以前は簡単な爬虫類を書いたことがありますが、毎日会社insgtagramのホームページのファン数を取得してファンのトレンドの展示に使います.コードは簡単ですが、ホームページのソースコードを取得した後、正規表現でjsonデータの列を一致させ、pythonのjson解析ライブラリで解析し、ファン数を取得します.
しかし、昨日この爬虫類の報告が間違っていて、insのホームページのソースコードをもう一度見てみると、その中に内容が追加されていることに気づきました.この内容はちょうど私にマッチしています.考えてみると、これは貪欲なマッチングの問題であることが明らかになった.
貪欲マッチングと非貪欲マッチング
これらの用語は驚くべきように聞こえますが、これは正則的に一致する2つのパターンで、説明しやすいです.
  • 欲張りマッチング:できるだけ長い文字列に合わせる
  • 欲張らないマッチング:できるだけ短い文字列にマッチング
  • 例を挙げるとaatest1bb
    test2
    cc
    完全なdivにマッチしたい場合は、貪欲モードの結果は、test1bb
    test2
    非貪欲モードの結果は、test1欲張りモードは、欲張りモードが最初のマッチングに成功した後にマッチングを停止するのではなく、できるだけ長い文字列に一致することがわかります.
    2つのパターンを区別する方法
    デフォルトではマッチングは貪欲モードですが、非貪欲モードに変更するには、量詞の後ろに疑問符を付けるだけですか?
    よく使われる量詞は次のとおりです.
  • {m,n}
  • {m,}
  • ?
  • *
  • +

  • これらのデフォルトは貪欲モードです.非貪欲モードに変更すると、次のようになります.
  • {m,n}?
  • {m,}?
  • ??
  • *?
  • +?

  • 上記の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 = (.*?);", 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()
    
    

    記事タイトル:正規表現の貪欲マッチングと非貪欲マッチング記事著者:Ciel Ni記事リンク:http://www.cielni.com/2017/09/07/greedy-matching/質問やアドバイスがあれば、私のブログで討論して、転載したり引用したりして、出典を明記してほしいと思っています.感謝しています.