2012-05-03 48 views
22

Tôi muốn nhận một vài ý kiến ​​về cách tốt nhất để thay thế chuỗi con của chuỗi bằng một số văn bản khác. Dưới đây là ví dụ:Thay thế chuỗi con của chuỗi bằng Python

Tôi có một chuỗi, a, có thể giống như "Xin chào tên tôi là $ name". Tôi cũng có một chuỗi, b, mà tôi muốn chèn vào chuỗi một ở vị trí của chuỗi con '$ name'.

Tôi cho rằng sẽ dễ dàng nhất nếu biến thay thế được chỉ ra một cách nào đó. Tôi đã sử dụng một dấu đô la, nhưng nó có thể là một chuỗi giữa các dấu ngoặc nhọn hoặc bất cứ điều gì bạn cảm thấy sẽ làm việc tốt nhất.

Giải pháp: Đây là cách tôi đã quyết định làm điều đó:

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

Tôi muốn hỏi xem xét lại để sử dụng phương pháp định dạng chuẩn nếu $ dạng cho sản phẩm thay thế là không unchangeble để { } –

Trả lời

55

Dưới đây là những cách phổ biến nhất để làm điều đó:

>>> 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 

Phương pháp sử dụng string.Template rất dễ dàng để tìm hiểu và nên làm quen để bash người sử dụng. Nó phù hợp cho việc tiếp xúc với người dùng cuối. Kiểu này đã có sẵn trong Python 2.4.

percent-style sẽ quen thuộc với nhiều người đến từ các ngôn ngữ lập trình khác. Một số người thấy kiểu này dễ bị lỗi vì dấu "s" trong %(name)s, bởi vì% -operator có ưu tiên giống như phép nhân và vì hành vi của các đối số được áp dụng phụ thuộc vào kiểu dữ liệu của chúng (các bộ và ký tự nhận được xử lý đặc biệt). Kiểu này đã được hỗ trợ bằng Python ngay từ đầu.

curly-bracket style chỉ được hỗ trợ trong Python 2.6 trở lên. Đó là phong cách linh hoạt nhất (cung cấp một bộ các ký tự điều khiển phong phú và cho phép các đối tượng thực hiện các trình định dạng tùy chỉnh).

+16

@kwikness - Tôi khá chắc chắn Raymond đã ám chỉ đến [Guido van Rossum] (http://en.wikipedia.org/wiki/Guido_van_Rossum) (pyth trên người sáng tạo và BDFL (nhà độc tài nhân từ cho cuộc sống)), Tim Peters ([TimSort] (http://en.wikipedia.org/wiki/Timsort) nổi tiếng, đã viết [Zen of Python] (http://stackoverflow.com/question/228181/the-zen-of-python), và [Barry Warsaw] (http://barry.warsaw.us/) (lớn trong python/jython - ví dụ, trong [april fools joke] (http : //www.python.org/dev/peps/pep-0401/) Bác Barry trở thành FLUFL (chú ngôn ngữ thân thiện cho cuộc sống). –

8

Thanh toán các replace() chức năng trong python. Dưới đây là một liên kết:

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

này nên có ích khi cố gắng thay thế một số văn bản mà bạn đã chỉ định. Ví dụ, trong liên kết họ chỉ cho bạn này:

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

Đối với mỗi từ "is", nó sẽ thay thế nó với từ "was".

+3

Đây thực sự là một ví dụ tốt về lý do tại sao str.replace là * không * những gì OP muốn: “this” sẽ trở thành “thwas” :) (vui lòng không có dấu chấm phẩy không cần thiết) –

11

Có một số cách để thực hiện, thường được sử dụng hơn thông qua các cơ sở đã được cung cấp bởi các chuỗi. Điều đó có nghĩa là việc sử dụng toán tử % hoặc tốt hơn, mới hơn và được đề xuất str.format().

Ví dụ:

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

Hoặc đơn giản hơn

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

Bạn cũng có thể sử dụng đối số vị trí:

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

Hoặc với chỉ số rõ ràng:

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

nào cho phép bạn thay đổi thứ tự của các trường trong chuỗi mà không thay đổi các cuộc gọi đến format():

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

Format là thật sự mạnh mẽ. Bạn có thể sử dụng nó để quyết định độ rộng của trường, cách viết số và định dạng sắp xếp khác, tùy thuộc vào nội dung bạn viết bên trong dấu ngoặc vuông.

Bạn cũng có thể sử dụng chức năng str.replace() hoặc cụm từ thông dụng (từ mô-đun re) nếu các thay thế phức tạp hơn.

2

Bạn cũng có thể sử dụng định dạng có% nhưng .format() được coi là hiện đại hơn.

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

nhưng nó cũng hỗ trợ một số kiểm tra kiểu như đã biết từ% định dạng thông thường:

>>> '%(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 
Các vấn đề liên quan