मान लीजिए मेरे पास यह स्ट्रिंग है: s = "blah blah blah" पायथन रेगेक्स का उपयोग करके, मैं "blah" के प्रत्येक उदाहरण को एक अलग मान से कैसे बदल सकता हूं (उदाहरण के लिए मेरे पास मानों की एक सूची है v = ("1", "2", "3")

12
zer0stimulus 3 सितंबर 2011, 18:36

4 जवाब

सबसे बढ़िया उत्तर

आप re.sub कॉलबैक का उपयोग कर सकते हैं:

import re
def callback(match):
    return next(callback.v)
callback.v=iter(('1','2','3'))

s = "blah blah blah"
print(re.sub(r'blah',callback,s))

पैदावार

1 2 3
21
unutbu 4 सितंबर 2011, 04:17
1
एक विशेषता के रूप में फ़ंक्शन में चलने योग्य जोड़ना वास्तव में एक अच्छा तरीका है।
 – 
zeekay
3 सितंबर 2011, 18:48
1
यह एक सुंदर उपाय है।
 – 
user688635
4 सितंबर 2011, 02:28
1
एक बंद रास्ता साफ होगा।
 – 
Jochen Ritzel
4 सितंबर 2011, 12:29

आप re.sub का उपयोग कर सकते हैं, जो एक स्ट्रिंग या कार्य करता है और इसे प्रत्येक मैच पर लागू करता है:

>>> re.sub('blah', lambda m, i=iter('123'): next(i), 'blah blah blah')
<<< '1 2 3'
12
zeekay 3 सितंबर 2011, 19:28

इस मामले में, आपको रेगेक्स की आवश्यकता नहीं है:

s.replace("blah","%s")%v

प्रतिस्थापन "%s %s %s" उत्पन्न करता है, फिर आप प्रारूप ऑपरेटर का उपयोग करते हैं

2
Foo Bah 3 सितंबर 2011, 18:41
2
जब तक s में % न हो।
 – 
Howard
3 सितंबर 2011, 18:42

मुझे लगता है कि आपको वास्तव में रेगेक्स की आवश्यकता नहीं है।

for x in v:
  s = s.replace('blah', x, 1)

हालांकि अगर आप वास्तव में रेगेक्स चाहते थे:

import re
for x in v:
  s = re.sub('blah', x, s, count=1)
2
wim 3 सितंबर 2011, 18:41
मुझे इसके साथ दो समस्याएं दिखाई देती हैं: 1) यह अक्षम है, क्योंकि .replace पर प्रत्येक कॉल स्ट्रिंग की शुरुआत में बदलने के लिए एक अवसर की खोज करना शुरू कर देता है। 2) यदि v में "blah" शब्द है तो यह सीधे काम नहीं करता है।
 – 
Aran-Fey
20 नवम्बर 2017, 21:17