快速提取URL列表并检查有效性的方法

时间:2017-07-14 15:52:22

标签: python regex

我正在研究聊天机器人。我希望每当发布到图像板上的图库的链接时,它都会发布来自API的匹配数据。图库链接看起来像这样

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上的网址的正则表达式并未显示您是如何仅匹配此类特定情况的,所以如果这是一个新问题,我很抱歉。

1 个答案:

答案 0 :(得分:1)

我不明白为什么你写了:a = [i for j in [l.items() for l in list2] for i in j] print "\n".join(filter(lambda item: item in a, itemlist)) 同时你确切地知道“1234是一个正数(id)而a6fb1049是一个固定长度为10”的十六进制字符串< / em> (&lt; =或者可能是8)。将这句话翻译成一个模式非常简单,只需要简单的概念:

https://example.org/a/(.*)/(.*)/

re.findall(r'(https://example.org/a/([0-9]+)/([0-9a-f]{10})/)', message) 是获取多个结果的方法re.findall仅返回第一个结果,请参阅re module manual

您获得一个列表列表,其中每个项目包含由圆括号(捕获组)包围的匹配部分,您可以随意将它们放在您想要的位置。

如果您想知道是否存在与您想要的格式不匹配的链接,您还可以使用以下内容:

re.search

然后你只需要测试组2是无或不知道链接是否具有良好的格式。