2012-05-03 16 views
22

Chciałbym poznać kilka opinii na temat najlepszego sposobu zastąpienia ciągu znaków ciągiem innym tekstem. Oto przykład:Zastąpienie podciągu napisu za pomocą Pythona

Mam ciąg znaków, a, który może być podobny do "Hello my name is $ name". Mam również inny ciąg, b, który chcę wstawić do napisu a w miejscu jego podłańcucha "$ nazwa".

Zakładam, że najłatwiej byłoby, gdyby zmienna wymienna została wskazana w jakiś sposób. Użyłem znaku dolara, ale może to być sznurek między nawiasami klamrowymi lub czymkolwiek, co uważasz za najlepsze.

Rozwiązanie: Oto jak postanowiłem zrobić:

from string import Template 


message = 'You replied to $percentageReplied of your message. ' + 
    'You earned $moneyMade.' 

template = Template(message) 

print template.safe_substitute(
    percentageReplied = '15%', 
    moneyMade = '$20') 
+1

Chciałbym poprosić o ponowne użyć standardowej metody formatowania jeśli format $ za substytuty nie jest unchangeble do { } –

Odpowiedz

55

Oto najczęstsze sposoby, aby to zrobić:

>>> import string 
>>> t = string.Template("Hello my name is $name") 
>>> print t.substitute(name='Guido') 
Hello my name is Guido 

>>> t = "Hello my name is %(name)s" 
>>> print t % dict(name='Tim') 
Hello my name is Tim 

>>> t = "Hello my name is {name}" 
>>> print t.format(name='Barry') 
Hello my name is Barry 

Podejście za pomocą string.Template jest łatwy do nauczenia i powinny być znane bash użytkowników. Nadaje się do ekspozycji dla użytkowników końcowych. Ten styl stał się dostępny w Pythonie 2.4.

Znajdzie się w nim wiele osób pochodzących z innych języków programowania. Niektórzy uważają, że ten styl jest podatny na błędy ze względu na końcowe "s" w %(name)s, ponieważ% -operator ma takie samo pierwszeństwo mnożenia, a ponieważ zachowanie zastosowanych argumentów zależy od ich typu danych (krotki i dyktury otrzymują specjalna obsługa). Ten styl jest wspierany w Pythonie od samego początku.

Interfejs curly-bracket style jest obsługiwany tylko w języku Python w wersji 2.6 lub nowszej. Jest to najbardziej elastyczny styl (zapewniający bogaty zestaw znaków kontrolnych i umożliwiający obiektom zaimplementowanie niestandardowych formaterów).

+16

@kwikness - jestem prawie pewien Raymond nawiązywał do [Guido van Rossum] (http://en.wikipedia.org/wiki/Guido_van_Rossum) (pyth twórca on i BDFL (życzliwy dyktator życia)), Tim Peters ([TimSort] (http://en.wikipedia.org/wiki/Timsort) sława, napisał [Zen of Python] (http://stackoverflow.com/questions/228181/the-zen-of-python)) i [Barry Warsaw] (http://barry.warsaw.us/) (duży w python/jython - np. w tym [żart primaaprilisowy] (http : //www.python.org/dev/peps/pep-0401/) Wujek Barry stał się FLUFL (przyjaznym wujkiem na całe życie). –

8

kasę funkcji Replace() w Pythonie. Oto link:

http://www.tutorialspoint.com/python/string_replace.htm

Powinno to być przydatne, gdy próbuje zastąpić część tekstu, które zostały określone. Na przykład w linku one pokazać to:

str = "this is string example....wow!!! this is really string" 
print str.replace("is", "was") 

za każde słowo "is", byłoby zastąpienie go słowem "was".

+3

To jest naprawdę dobry przykład dlaczego str.replace to * nie * to, co OP chce: "to" stanie się "thwas" :) (proszę nie niepotrzebne średniki dzięki) –

11

Istnieje wiele sposobów, aby to zrobić, bardziej powszechnie stosowane są obiekty udostępnione przez ciągi. Oznacza to użycie operatora %, a jeszcze lepiej nowszego i zalecanego str.format().

Przykład:

a = "Hello my name is {name}" 
result = a.format(name=b) 

Albo prościej

result = "Hello my name is {name}".format(name=b) 

Można również użyć argumentów pozycyjnych:

result = "Hello my name is {}, says {}".format(name, speaker) 

Albo z wyraźnymi indeksami:

result = "Hello my name is {0}, says {1}".format(name, speaker) 

który pozwala zmienić kolejność pól w ciągu bez zmiany wezwanie do format():

result = "{1} says: 'Hello my name is {0}'".format(name, speaker) 

Format jest naprawdę potężny. Możesz go użyć do określenia, jak szeroko utworzyć pole, jak pisać liczby i inne formatowanie sortowania, w zależności od tego, co piszesz w nawiasach.

Można również użyć funkcji str.replace() lub wyrażeń regularnych (z modułu re), jeśli zamienniki są bardziej skomplikowane.

2

Możesz także użyć formatowania z%, ale .format() jest uważane za bardziej nowoczesne.

>>> "Your name is %(name)s. age: %(age)i" % {'name' : 'tom', 'age': 3} 
'Your name is tom' 

ale obsługuje również niektóre sprawdzanie typu znanego ze zwykłej% formatowania:

>>> '%(x)i' % {'x': 'string'} 

Traceback (most recent call last): 
    File "<pyshell#40>", line 1, in <module> 
    '%(x)i' % {'x': 'string'} 
TypeError: %d format: a number is required, not str 
Powiązane problemy