我正在研究聊天机器人。我希望每当发布到图像板上的图库的链接时,它都会发布来自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上的网址的正则表达式并未显示您是如何仅匹配此类特定情况的,所以如果这是一个新问题,我很抱歉。
答案 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是无或不知道链接是否具有良好的格式。