表单文本读取与变量替换异常:为何仅捕获首尾行且替换错误
问题排查与修复方案
错误根源
- 定位缺失:
find()仅返回第一个{/}的索引,rfind()仅返回最后一个的索引,完全没处理中间的{ phone }占位符,导致它直接保留在结果中。 - 切片逻辑混乱:
part_3 = text[d + 1:u]中,d是最后一个}的位置,u是第一个{的位置,后者远小于前者,切片结果为空字符串。part_4 = text[p:-2]的取值范围错误,导致tg_phone和tg_vacancy被直接拼接在一起。
- 冗余变量:
u和p的重复定义完全没用,属于无效代码。
修复方法
最优方案:用字符串format方法(简洁可靠)
Python内置的格式化语法可自动匹配所有占位符,彻底避免手动切片的错误:
# 假设settings.tg_message的原始内容为: # "Name : {name}\nPhone : {phone}\nVacancy : {vacancy}" text = str(settings.tg_message) # 直接传入变量替换所有占位符 text_message = text.format(name=tg_name, phone=tg_phone, vacancy=tg_vacancy)
备选方案:正则批量替换(适配复杂格式)
如果占位符有多余空格或格式不统一,用正则表达式批量替换:
import re text = str(settings.tg_message) # 匹配{ 变量名 }格式的占位符(兼容前后空格) placeholder_pattern = re.compile(r'\{\s*(\w+)\s*\}') # 定义变量映射表 replacements = { 'name': tg_name, 'phone': tg_phone, 'vacancy': tg_vacancy } # 批量替换占位符 text_message = placeholder_pattern.sub(lambda match: replacements.get(match.group(1), match.group()), text)
手动分割方案(仅作原理演示,不推荐)
如果一定要手动处理,可通过分割拼接实现,但扩展性极差:
text = str(settings.tg_message) # 按占位符分割后逐个拼接变量 segments = text.split('{ name }') seg1 = segments[0] + tg_name seg2 = segments[1].split('{ phone }') seg3 = seg2[0] + tg_phone seg4 = seg2[1].split('{ vacancy }') text_message = seg3 + seg4[0] + tg_vacancy + seg4[1]
修复后效果
执行上述任一方案,都会得到预期输出:
Name : john Phone : +359557664848 Vacancy : courier
内容的提问来源于stack exchange,提问作者Claus
相关产品推荐
相关产品推荐

