You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

代码说明

  1. Markdown链接正则:\[(.*?)\]\((http[s]?://.*?)\) 使用非贪婪匹配.*?,确保精准捕获[]内的文本和()内的URL,避免过度匹配。
  2. 普通链接正则:(?<!\()是负向断言,确保匹配的URL不在括号内(也就是不会重复抓取Markdown链接里的URL)。
  3. 去重逻辑:通过集合存储已识别的URL,避免同一个URL被多次添加到结果列表中。
  4. 普通链接处理:因为普通链接没有显示文本,这里将link_text设为URL本身,你可以根据需求改为空字符串或其他默认值。

内容的提问来源于stack exchange,提问作者user28547173

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:52:14