2010-01-19 12 views
14

Selamlar hepsiPython re.sub soru

bunun mümkün olup olmadığından emin değilim ama değişkenleri aramak için bir normal ifade yerine eşleşti grupları kullanmak istiyorum.

a = 'foo' 
b = 'bar' 

text = 'find a replacement for me [[:a:]] and [[:b:]]' 

desired_output = 'find a replacement for me foo and bar' 

re.sub('\[\[:(.+):\]\]',group(1),text) #is not valid 
re.sub('\[\[:(.+):\]\]','\1',text) #replaces the value with 'a' or 'b', not var value 

düşünceler?

+0

ha! pek sayılmaz. py, perl ve php ile tanıma - hiçbirinin efendisi. Yardımlarınız için teşekkürler :) – netricate

cevap

24

? düzenli ifadede. Burada açgözlü olmayan bir eşleşme istiyorsun.

Anladım ki bu sadece bir kavramı göstermek için örnek koddur, ancak verdiğiniz örnek için basit dize biçimlendirmesi daha iyidir.

+0

kod için teşekkürler! Bu aslında düşündüğüm şeye daha yakın. – netricate

+2

Sorunuzu cevapladım, ama bence yanlış soruyu soruyordunuz. Uygun olduğunda, lütfen düzenli ifadelere göre dize biçimlendirmesini kullanın. Noufal İbrahim sorman gereken soruyu yanıtladı. –

+0

İade beyanlarındaki tırnak işaretlerini unutmayın. :) –

8

Kulağa çok fazla benziyor. Neden sadece

text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar') 

? http://docs.python.org/library/re.html#text-munging

a = 'foo' 
b = 'bar' 

text = 'find a replacement for me [[:a:]] and [[:b:]]' 

desired_output = 'find a replacement for me foo and bar' 

def repl(m): 
    contents = m.group(1) 
    if contents == 'a': 
     return a 
    if contents == 'b': 
     return b 

print re.sub('\[\[:(.+?):\]\]', repl, text) 

Ayrıca ekstra dikkat edin: re.sub kullanırken gruplara erişimi olan, bir geri arama belirtebilirsiniz

+0

metni DB'de saklanır. Sanırım tüm [[::]] değerlerini%() değerleriyle değiştirebilirim ve bu da işe yaramalı. Bir deneyeyim. Teşekkürler! – netricate

+0

Bu yöntem, [[a:]] ve [[: b:]] konumlarını bildiğinize bağlıdır. – ghostdog74

+0

Birçok sorun var ama OP'nin yapmaya çalıştığı şey kavramsal olarak dizgi biçimlendirmesiyle aynı. –

2
>>> d={}             
>>> d['a'] = 'foo'          
>>> d['b'] = 'bar' 
>>> text = 'find a replacement for me [[:a:]] and [[:b:]]' 
>>> t=text.split(":]]") 
>>> for n,item in enumerate(t): 
... if "[[:" in item: 
...  t[n]=item[: item.rindex("[[:") +3 ] + d[ item.split("[[:")[-1]] 
... 
>>> print ':]]'.join(t) 
'find a replacement for me [[:foo:]] and [[:bar:]]' 
+0

başka bir bakış için teşekkürler. çok havalı! :) – netricate