Telegram消息链接检测脚本报错ValueError: too many values to unpack
解决链接检测报错并支持Markdown链接+普通链接识别
报错原因
你的正则表达式只能匹配独立的URL,re.findall返回的是单个字符串组成的列表,但后续代码试图把每个字符串拆成link_text和link_url两个变量,这就导致了ValueError: too many values to unpack (expected 2)。
修复方案
要同时识别带文本的Markdown链接和普通独立链接,需要分别编写对应的正则规则,先捕获Markdown格式的链接文本与URL,再捕获未被包含在Markdown结构里的普通链接,最后合并结果。
修改后的代码:
import re def find_all_links(message): # 匹配Markdown格式链接:[显示文本](URL) markdown_link_regex = re.compile(r'\[(.*?)\]\((http[s]?://.*?)\)') # 匹配普通独立链接,用负向断言排除Markdown链接里的URL(避免重复识别) plain_link_regex = re.compile(r'(?<!\()http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') links = [] # 提取Markdown链接的文本和URL markdown_matches = markdown_link_regex.findall(message) links.extend(markdown_matches) # 提取普通链接,去重避免重复添加已识别的URL existing_urls = {url for _, url in links} plain_matches = plain_link_regex.findall(message) for url in plain_matches: if url not in existing_urls: # 普通链接无显示文本,这里将文本设为URL本身,也可改为("", url) links.append((url, url)) return links # 测试示例 message = "Look at [my website](https://example.com)! Also check https://test.org and [another link](https://example.com)" links = find_all_links(message) for link_text, link_url in links: print(f"Link text: {link_text}, URL: {link_url}")
代码说明
- Markdown链接正则:
\[(.*?)\]\((http[s]?://.*?)\)使用非贪婪匹配.*?,确保精准捕获[]内的文本和()内的URL,避免过度匹配。 - 普通链接正则:
(?<!\()是负向断言,确保匹配的URL不在括号内(也就是不会重复抓取Markdown链接里的URL)。 - 去重逻辑:通过集合存储已识别的URL,避免同一个URL被多次添加到结果列表中。
- 普通链接处理:因为普通链接没有显示文本,这里将
link_text设为URL本身,你可以根据需求改为空字符串或其他默认值。
内容的提问来源于stack exchange,提问作者user28547173
相关产品推荐
相关产品推荐

