2017-07-14 92 views
0

我正在使用聊天机器人。我希望它发布匹配的数据从一个API时,只要链接到图像板上的画廊发布。图库链路看起来像这样快速提取URL列表并检查有效性的方法

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

其中1234是一个正数(ID)和a6fb1049是固定长度10(令牌)的十六进制字符串。 现在我只能够处理以图库链接开始的消息。

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分割字符串,并检查不同的子串,但我觉得这是低效的。

因为我对Regex不太好,这就是我想出来的。

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

如果只有一个匹配的模式,它是正确的,但它是正确的,但只要有两个链接,这已经失败。

我宁愿让匹配列表中的链接的所有消息,然后迭代列表并检查页面的标题,如果链接有效。然后创建一个API请求来检索数据。

匹配Stackoverflow上的URL的正则表达式不显示如何匹配这些特定的情况,所以我很抱歉,如果这是一个新问题。

+0

“我宁愿让所有匹配列表中的链接的消息,然后遍历列表” - 听起来像你需要['re.findall'](https://docs.python.org/2/library/ re.html#re.findall) – asongtoruin

回答

0

我不明白为什么要这么写:https://example.org/a/(.*)/(.*)/当在同一时间,你恰恰知道“1234是正数(ID)和a6fb1049是固定长度10的十六进制字符串”(< =或也许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组是无或者不知道链接是否具有良好的格式。

+0

谢谢,这正是我一直在寻找的 – siryx