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

如何用Python re.sub将<@token>替换为其MD5值并传递参数?

如何用Python的re.sub将<@token>替换为对应MD5值?

你遇到的问题其实是对re.sub的函数参数用法理解错啦~先说说你之前代码的问题:你写的re.sub(pattern, fun(r'\1'), string)是直接调用了fun(r'\1'),这时候函数返回的是一个固定字符串(比如!1),相当于用这个固定值替换所有匹配项,而不是针对每个匹配的<@token>动态处理。

正确的实现方式

re.sub支持把一个函数作为第二个参数,这个函数会自动接收**匹配对象(Match object)**作为输入,我们可以从这个对象里提取出需要的token,计算MD5后返回替换结果。

下面是完整的示例代码:

import re
import hashlib

def token_to_md5(match):
    # 从匹配的字符串中提取@后面的token部分,比如从<@AAAA>中拿到AAAA
    token = match.group(0).strip('<@>')
    # 计算token的MD5值(注意要先转成字节串)
    md5_hash = hashlib.md5(token.encode('utf-8')).hexdigest()
    # 返回替换后的内容,这里可以按需调整格式,比如保留<>或者直接返回MD5
    return md5_hash

# 匹配<@xxx>格式的正则
pattern = r'<@\w+>'
# 测试字符串
input_string = '<@AAAA> there is some regular text <@something_else> and even more <@foo> <@bar> text'

# 执行替换
result = re.sub(pattern, token_to_md5, input_string)
print(result)

为什么你的原代码不生效?

你之前的写法fun(r'\1')是提前调用了函数,把函数的返回值(一个字符串)传给了re.sub,而不是让re.sub在每次匹配时调用函数。正确的做法是直接传递函数名(不带括号),这样re.sub会在每次匹配到内容时,把匹配对象传给这个函数,用函数的返回值作为替换内容。

比如你原来的替换@为!的需求,正确写法应该是:

import re

def replace_at(match):
    return match.group(0).replace('@', '!')

pattern = r'(<@\w+>)'
string = '<@AAAA> some text and more text <@BBBBB>'
print(re.sub(pattern, replace_at, string))
# 输出:<!AAAA> some text and more text <!BBBBB>

这样就能正常生效啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:01