python - % S को{0},{1}... कम क्लंकी में कैसे बदलें?




python-3.x (4)

मुझे बाद में प्रतिस्थापन के लिए एक स्ट्रिंग युक्त प्लेसहोल्डर्स लेना होगा, जैसे:

"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 (कोई %i %f जो भी हो) का उपयोग करने की गारंटी है

क्या आपने .format के साथ प्रयास किया है?

string.format (0 = मान, 1 = मान)

इसलिए:

"A {0} B {1}".format(0=value, 1=value)


गतिशील प्रतिस्थापन के लिए 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}

प्रत्येक तत्व के लिए एक बार प्रतिस्थापन को फिर से लागू करने के लिए एक re.sub साथ 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 ताज़ा करने की आवश्यकता होगी।


मुझे लगता है कि वह काम करता है

rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))





python-3.x