如何用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
相关产品推荐
相关产品推荐

