나중에 대체 할 자리 표시자를 포함하는 문자열을 가져와야합니다.
"A %s B %s"
그리고 그것을 다음으로 바꾸십시오 :
"A {0} B {1}"
나는 생각해 냈다 :
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
그것은 효과가 있지만, “아이디 오 매틱”파이썬이 아니라, 매우 어색한 느낌이 든다.
관용적 인 파이썬 솔루션은 어떻습니까?
설명을위한 업데이트 :
- 결과 문자열은 파이썬 내에서 사용되지 않습니다. 내가 어떻게 거기에 카운터 번호가 필요합니다! (그래서
{}
충분하지 않습니다)! - 난 단지에 대해 신경 쓸 필요가
%s
메시지 만 사용 보장으로, 문자열%s
(NO%i %f
무엇이든지)
답변
나는 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
답변
re.sub
람다 함수와 함께 사용 하여 각 요소에 대해 대체를 한 번 다시 적용하고 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}'
새로 고쳐야하므로이 작업을 한 번 이상 수행하려면이 기능을 랩핑해야합니다 itertools.count
.
답변
나는 그 shoudl 작품 생각
rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))
답변
하여 re.sub
동적 교체를 위해 :
import re
text = "A %s B %s %s B %s"
def _fix_substitution_parms(raw_message):
counter = 0
def replace(_):
nonlocal counter
counter += 1
return '{{{}}}'.format(counter - 1)
return re.sub('%s', replace, raw_message)
print(_fix_substitution_parms(text)) # A {0} B {1} {2} B {3}
답변
발전기 사용하기 :
def split_and_insert(mystring):
parts = iter(mystring.split('%s'))
yield next(parts)
for n, part in enumerate(parts):
yield f'{{{n}}}'
yield part
new_string = ''.join(split_and_insert("A %s B %s"))
답변
.format을 사용해 보셨습니까?
string.format (0 = 값, 1 = 값)
그래서:
"A {0} B {1}".format(0=value, 1=value)