如何将%s变成{0},{1} ...不太笨重?

Gho*_*ica 11 python python-3.x

我必须将包含占位符的字符串用于以后的替换,例如:

"A %s B %s"
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

"A {0} B {1}"
Run Code Online (Sandbox Code Playgroud)

我想出了:

def _fix_substitution_parms(raw_message):
  rv = raw_message
  counter = 0
  while '%s' in rv:
    rv = rv.replace('%s', '{' + str(counter) + '}', 1)
    counter = counter + 1
return rv
Run Code Online (Sandbox Code Playgroud)

那行得通,但是感觉超级笨拙,根本不是“惯用的” python。

良好的惯用python解决方案会是什么样子?

更新说明:

  • 生成的字符串未在python中使用。我确实需要那里的柜台号码!(所以{}还不够好)!
  • 我只需要关心%s字符串,因为保证消息仅使用%s(什么也%i %f没有)

jfa*_*oni 8

re.sub与lambda函数一起使用,可以为每个元素重新应用一次替换,并itertools.count依次获取数字:

import itertools
import re

s = "A %s B %s"

counter = itertools.count()
result = re.sub('%s', lambda x: f'{{{next(counter)}}}', s)
print(result)  # 'A {0} B {1}'
Run Code Online (Sandbox Code Playgroud)

请记住将其包装在一个函数中以多次执行此操作,因为您需要刷新itertools.count


Dan*_*Dan 5

我会按照Reznik 最初的建议去做,然后呼吁.format

def _fix_substitution_parms(raw_message: str) -> str:
    num_to_replace = raw_message.count("%s")
    python_format_string_message = raw_message.replace("%s", "{{{}}}")
    final_message = python_format_string_message.format(*range(num_to_replace))
    return final_message
Run Code Online (Sandbox Code Playgroud)