Python使用re.search匹配单行多个<<ALTER>>标记并替换对应变量值的问题
问题根因
你使用的正则<<ALTER(.*)>>中的.*属于贪婪匹配模式,会尽可能匹配最长的符合规则的字符串,因此会把第一个<<ALTER到最后一个>>之间的所有内容都算成匹配结果,自然无法识别两个独立的占位符。
修复方案
直接用re.sub()的回调函数能力,结合精准变量捕获或者非贪婪匹配,一次完成所有占位符替换,参考实现代码如下:
import re # 你的参数映射字典 ParameterDictionary = {"Ion1": "Na", "Value1": 1.0} line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1>>\n' # 正则精准匹配占位符,兼容等号前后任意空格,同时捕获变量名 pattern = r"<<ALTER,\s*variable\s*=\s*(\w+)\s*>>" processedline = re.sub( pattern, lambda match_item: str(ParameterDictionary[match_item.group(1)]), line ).strip()
运行后processedline的输出和预期完全一致。
如果需要兼容更多可变的占位符格式,可以把正则调整为非贪婪匹配的通用写法,适配占位符内的格式变化:
import re ParameterDictionary = {"Ion1": "Na", "Value1": 1.0} line = 'Text1 <<ALTER, variable = Ion1>> Text2 <<ALTER, variable = Value1>>\n' def replace_alter(match): content = match.group(1).strip() var_name = content.split("=")[-1].strip() return str(ParameterDictionary[var_name]) processedline = re.sub(r"<<ALTER(.*?)>>", replace_alter, line).strip()
内容的提问来源于stack exchange,提问作者Luis Lamas
相关产品推荐
相关产品推荐

