2017-07-14 2 views
0

私はチャットボットに取り組んでいます。イメージボード上のギャラリーへのリンクが投稿されたときにいつでもAPIから一致するデータを投稿したいと思う。ギャラリーリンク1234は正の数(ID)であり、a6fb1049固定長10(トークン)の16進文字列であり、このURLのリストを抽出して有効性を確認するための速やかな方法

https://example.com/a/1234/a6fb1049/ 

ように見えます。 今はギャラリーリンクから始まるメッセージしか処理できません。

if message_object.content.startswith("https://example.com/a/"): 

私は、メッセージが送信されるたびにメッセージ文字列を処理するための迅速な方法を探しています。

if message_object.content.startswith("https://example.org/a/"): 

     temp = message_object.content.split("/") 

     # Check if link is actually a valid link 
     if temp[2] == "example.org" and temp[3] == "a" and 0 < int(temp[4]) and len(temp[5]) == 10: 
      gallery_id = temp[4] 
      gallery_token = temp[5] 

      response = requests.post(url, payload, json_request_headers) 

私は、文字列を分割するurllib.parse.urlparseとposixpath.splitを使用して、別の部分文字列をチェックする考えたが、これは非効率的であるような気がします。

私は本当に正規表現では良くないので、これは私が思いついたすべてです。

searchObj = re.search(r'https://example.org/a/(.*)/(.*)/', message) 

とすぐに、これはすでに失敗している2つのリンクがあるとして一つだけのマッチングパターンが存在する場合には罰金だし、それは正しいですが、。

リスト内のリンクに一致するすべてのメッセージを取得し、リストを繰り返して、リンクが有効であればページのヘッダーを確認します。次に、データを取得するためのAPIリクエストを作成します。

StackoverflowのURLにマッチする正規表現では、そのような特定のケースのみの一致が示されていないので、これがnewbの質問であると申し訳ありません。あなたが書いた理由を私は理解していない

+0

"リストの中でリンクに一致するすべてのメッセージを取得し、リストを反復処理したい" - 必要に応じて[re.findall'](https://docs.python.org/2/library/)のように聞こえます。 re.html#re.findall) – asongtoruin

答えて

0

https://example.org/a/(.*)/(.*)/を同時に使用すると、正確に「1234は正の数(ID)であるとa6fb1049は固定長10の16進数の文字列である」ことを知っているとき(< =またはおそらく8)。パターンにこの文を翻訳することは非常に簡単で、単純な概念必要があります。

re.findall(r'(https://example.org/a/([0-9]+)/([0-9a-f]{10})/)', message) 

re.findallをいくつかの結果を取得するための方法である(re.searchリターンのみ最初の結果は、re module manualを参照してください)

あなたは得ます各項目に丸括弧(キャプチャグループ)で囲まれた一致部分が含まれているリストのリストは、好きな場所に自由に置くことができます。あなたもこのようなものを使用することができます

あなたが欲しいの形式と一致しないリンクがあるかどうかを知りたい場合は、:あなただけのテストを持って次に

re.findall(r'(https://example.org/a/(?:([0-9]+)/([0-9a-f]{10})/)|.*)', message) 

は、グループ2がNoneでありますリンクが適切な形式であるかどうかを知ることはできません。

+0

ありがとう、これは私が探していたものです – siryx

関連する問題