Python 2.7中str.format()拼接字符串后替换失效问题求助
问题分析:Python字符串拼接后
.format()未正确替换占位符 这事儿核心是Python的运算符优先级在搞鬼!咱们一步步拆解来看看:
先看你出问题的代码:
command = "for i in `python {0}_getSyslogs.py {1} {2} {3}`\ndo\ngunzip -c {3}/$i | egrep -i '{4}' >> " + "test" .format(a,b,c,d,e)
Python里,.(方法调用的运算符)优先级比+(字符串拼接)高得多,所以代码会先执行"test".format(a,b,c,d,e)——但"test"里根本没有占位符,这一步等于白操作,结果还是"test"。
而前面那段带着{0}、{4}的长字符串,完全没机会调用.format()方法,就直接和"test"拼接到一起了,那些占位符自然原封不动留在里面,结果肯定不符合预期。
两种解决办法任你选:
- 方法一:给整个拼接表达式加括号,确保统一执行
.format()
把要拼接的两个字符串用括号括起来,再整体调用.format(),这样所有占位符都会被正确替换:
command = ("for i in `python {0}_getSyslogs.py {1} {2} {3}`\ndo\ngunzip -c {3}/$i | egrep -i '{4}' >> " + "test").format(a,b,c,d,e)
- 方法二:把"test"直接整合到原字符串(更简洁)
既然"test"是固定内容,不如直接写到原字符串末尾,一次.format()就搞定所有替换:
command = "for i in `python {0}_getSyslogs.py {1} {2} {3}`\ndo\ngunzip -c {3}/$i | egrep -i '{4}' >> test".format(a,b,c,d,e)
另外提一句,你用的是Python2.7,要是换成Python3.6+还能用上f-string,写法会更直观,但目前用上面两种方法就能完美解决问题啦。
内容的提问来源于stack exchange,提问作者musca999
相关产品推荐
相关产品推荐

