Python dizeleri değiştirirken bir sözlük geçebilir?

4 Cevap php

PHP, size desen ve yedek bir dizi ileterek kerede tüm oyuncu değişikliği yapabilir nerede, preg_replace($patterns, $replacements, $string) var.

Python eşdeğer nedir?

Ben fark ettim dize ve yeniden fonksiyonlar replace() ve sub() sözlükler yapmayız ...

Edited to clarify based on a comment by rick: the idea is to have a dict with keys to be taken as regular expression patterns, such as '\d+S', and (hopefully) constant string values (hopefully w/o backreferences). Now editing my answer accordingly (i.e. to answer the actual question).

4 Cevap

yakın muhtemelen:

somere.sub(lambda m: replacements[m.group()], text)

örneğin:

>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'

Bir .get yerine indeksleme-[] size eksik olan maçlar için bir varsayılan kaynağı olmak istiyorsanız replacements.

Edit: ne rick gerçekten istediği gibi '\d+S' gibi düzenli ifade kalıpları, ve (umarım w / Geribaşvurularda o) (umarım) sabit dize değerleri olarak alınacak tuşları ile bir dicti sahip olmaktır. Kitabı tarifi bu amaç için adapte edilebilir:

def dict_sub(d, text): 
  """ Replace in 'text' non-overlapping occurences of REs whose patterns are keys
  in dictionary 'd' by corresponding values (which must be constant strings: may
  have named backreferences but not numeric ones). The keys must not contain
  anonymous matching-groups.
  Returns the new string.""" 

  # Create a regular expression  from the dictionary keys
  regex = re.compile("|".join("(%s)" % k for k in d))
  # Facilitate lookup from group number to value
  lookup = dict((i+1, v) for i, v in enumerate(d.itervalues()))

  # For each match, find which group matched and expand its value
  return regex.sub(lambda mo: mo.expand(lookup[mo.lastindex]), text)

Örnek kullanım:

  d={'\d+S': 'wot', '\d+T': 'zap'}
  t='And 23S, and 45T, and 66T but always 029S!'
  print dict_sub(d, t)

yayar:

And wot, and zap, and zap but always wot!

Sen binayı lookup önlemek ve sadece mo.expand(d.values()[mo.lastindex-1]) kullanmak, ancak d çok büyük ve çok maçlar var eğer biraz yavaş olabilir (üzgünüm, cenneti olabilir ' t her ikisi de hassas yaklaşımları Benchmarking / ölçülmüş, bu nedenle bu ;-) sadece bir tahmin.

Bunu yapmak için yeterince kolay:

replacements = dict(hello='goodbye', good='bad')
s = "hello, good morning";
for old, new in replacements.items():
    s = s.replace(old, new)

PHP fonksiyonları bir değerler dizisi kabul ve doğrudan Python eşdeğeri yoktur, ancak bir sorun daha az olduğunu bu yüzden Python diziler (listeleri) ile çalışmak çok daha kolay pek çok yerde bulabilirsiniz.

İşte azaltmak kullanarak basit bir yoludur

mynewstring=reduce(lambda a,(b,c): a.replace(b, c), mydict.items(), mystring)

You can pass the dictionary while replacing string in python. Consider the above example:

replacement = {'hello' : 'goodbye', 'good' : 'bad' }

Bu biçimde dize yazmak var

s = "%(hello)s, %(good)s morning"
changed_s = s%replacement

changed_s çıkış olacak

"goodbye, bad morning"