Làm cách nào để có được chuỗi con của chuỗi trong Python?


2144

Có cách nào để xâu chuỗi một chuỗi trong Python, để có được một chuỗi mới từ ký tự thứ ba đến cuối chuỗi không?

Có lẽ như thế myString[2:end]nào?

Nếu rời khỏi phần thứ hai có nghĩa là 'cho đến khi kết thúc', và nếu bạn rời khỏi phần đầu tiên, nó có bắt đầu từ đầu không?


1
Điều này có chứa một lời giải thích rõ ràng pythoncentral.io/cocking-and-slicing-strings-in-python
mario ruiz

Câu trả lời:


3178
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python gọi khái niệm này là "cắt" và nó hoạt động trên nhiều chuỗi chứ không chỉ là chuỗi. Hãy xem ở đây để giới thiệu toàn diện.


401

Chỉ để hoàn thiện như không có ai khác đã đề cập đến nó. Tham số thứ ba cho một lát mảng là một bước. Vì vậy, đảo ngược một chuỗi là đơn giản như:

some_string[::-1]

Hoặc chọn các ký tự thay thế sẽ là:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Khả năng bước tiến và lùi thông qua chuỗi duy trì tính nhất quán với khả năng sắp xếp mảng từ đầu hoặc cuối.


21
@mtahmed hoàn toàn liên quan đến câu hỏi. Điều gì nếu bạn muốn chuỗi con bằng cách chọn các ký tự thay thế từ chuỗi? Đó sẽ là my_opes [:: 2]
Endophage

Tôi nghĩ nhiều khả năng bạn muốn đề cập đến tham số thứ ba để cắt. Cần lấy mọi ký tự khác từ một chuỗi có thể là trường hợp sử dụng quan trọng ở đâu đó, nhưng tôi chưa bao giờ phải làm điều đó. Không có gì sai khi muốn thể hiện những gì bạn biết - điểm cần biết là gì nếu bạn không thể làm điều đó. :) Nhưng trường hợp liên quan đến câu hỏi đã được phóng đại.
John Lockwood

1
Chắc chắn, ví dụ cụ thể về việc chọn các ký tự thay thế có thể không liên quan đến câu hỏi, nhưng hiểu rằng có một tham số thứ 3 để cắt rất nhiều có liên quan và các ví dụ đơn giản phục vụ để minh họa cách hoạt động của nó. Cộng đồng Python cũng có một lịch sử tuyệt vời trong việc giáo dục các thành viên mới một cách thân thiện :-)
Endophage

127

Substr () bình thường (tức là PHP và Perl) hoạt động theo cách này:

s = Substr(s, beginning, LENGTH)

Vì vậy, các tham số là beginningLENGTH.

Nhưng hành vi của Python thì khác; nó mong đợi bắt đầu và một sau khi kết thúc (!). Điều này rất khó để nhận ra bởi người mới bắt đầu. Vì vậy, sự thay thế chính xác cho Substr (s, bắt đầu, LENGTH) là

s = s[ beginning : beginning + LENGTH]

76
Những người mới bắt đầu nên học cách pythonic khi chuyển sang python, không dính vào các thói quen ngôn ngữ khác
Nicu Surdu

3
Và để hoàn thiện, Java giống như Python ở chỗ phương thức String.subopes () bắt đầu và một quá khứ. Điều này chỉ làm tôi khó khăn một chút, tôi đã cho rằng nó có độ dài như mọi hàm chuỗi con khác trên thế giới.
PhilHibbs

4
Một cách (có lẽ) nhiều cách để làm điều đó làs[beginning:][:length]
victortv

2
Là một người bắt đầu với Python thay vì [từ bẩn] - ngôn ngữ như PHP, tôi nghĩ Python đơn giản và trực quan hơn nhiều với chuỗi [bắt đầu: kết thúc]. Độ dài thường không liên quan.
Gloweye

60

Một cách phổ biến để đạt được điều này là bằng cách cắt chuỗi.

MyString[a:b] cung cấp cho bạn một chuỗi con từ chỉ mục a đến (b - 1).


23

Một ví dụ dường như bị thiếu ở đây: bản sao đầy đủ (nông).

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

Đây là một thành ngữ phổ biến để tạo một bản sao của các loại chuỗi (không phải các chuỗi được liên kết) , [:]. Shallow sao chép một danh sách, xem cú pháp lát danh sách Python được sử dụng mà không có lý do rõ ràng .


12
Điều này gần như không có gì để làm với câu hỏi về chuỗi con. Thậm chí không áp dụng cho chuỗi. Nói chuỗiA = stringB là đủ ...
Nicu Surdu

2
Bản sao đầy đủ [:] tạo ra một BẢN SAO MỚI, sử dụng cú pháp lát và được đọc là "chuỗi con từ đầu đến cuối"
gimel

2
Điểm gì từ chuỗi là bất biến? a=bnên là đủ
bfontaine

1
@gimel: Trên thực tế, [:]trên một loại không thay đổi hoàn toàn không tạo ra một bản sao. Trong khi mysequence[:]hầu như vô hại khi mysequencelà một loại hình bất biến như str, tuple, bytes(Py3) hoặc unicode(Py2), a = b[:]tương đương với a = b, nó chỉ lãng phí một chút thời gian cử các cắt mã byte mà chúng phản ứng đối tượng bằng cách trả lại bản thân kể từ khi nó vô nghĩa để sao chép cạn khi , ngoài các thử nghiệm nhận dạng đối tượng, nó tương đương với việc trả lại một tham chiếu khác cho bản thân bất biến của một người.
ShadowRanger

3
Cố gắng tổng hợp những lời chỉ trích khác về câu trả lời này: Trong Python, các chuỗi là bất biến, do đó không có lý do gì để tạo một bản sao của chuỗi - vì vậy s[:]không tạo ra một bản sao nào cả : s = 'abc'; s0 = s[:]; assert s is s0. Vâng, đó là cách thành ngữ để sao chép một danh sách trong Python cho đến khi có danh sách list.copy, nhưng một lát đầy đủ của một loại không thay đổi không có lý do để tạo một bản sao vì nó không thể thay đổi, vì vậy cũng có thể chỉ có một trong bộ nhớ và chúng ta không nên lãng phí thời gian sao chép nó. Vì câu trả lời này là sai và thậm chí không trả lời câu hỏi - nên xóa nó đi?
Aaron Hall

18

Có cách nào để xâu chuỗi một chuỗi trong Python, để có được một chuỗi mới từ ký tự thứ 3 đến cuối chuỗi không?

Có lẽ như thế myString[2:end]nào?

Có, điều này thực sự hoạt động nếu bạn gán, hoặc liên kết , tên end, cho singleton liên tục , None:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Ký hiệu lát có 3 đối số quan trọng:

  • khởi đầu
  • dừng lại
  • bươc

Mặc định của chúng khi không được đưa ra là None- nhưng chúng ta có thể vượt qua chúng một cách rõ ràng:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

Nếu rời khỏi phần thứ hai có nghĩa là 'cho đến khi kết thúc', nếu bạn rời khỏi phần đầu tiên, nó có bắt đầu từ đầu không?

Vâng, ví dụ:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Lưu ý rằng chúng tôi bao gồm bắt đầu trong lát, nhưng chúng tôi chỉ đi đến và không bao gồm, dừng lại.

Khi bước là None, theo mặc định, lát sử dụng 1cho bước. Nếu bạn bước với một số nguyên âm, Python đủ thông minh để đi từ đầu đến cuối.

>>> myString[::-1]
'0987654321'

Tôi giải thích ký hiệu lát rất chi tiết trong câu trả lời của tôi để Giải thích Câu hỏi ký hiệu lát.


8

Bạn đã có nó ngay tại đó ngoại trừ "kết thúc". Nó được gọi là ký hiệu lát. Ví dụ của bạn nên đọc:

new_sub_string = myString[2:]

Nếu bạn bỏ qua tham số thứ hai, nó hoàn toàn là phần cuối của chuỗi.


6

Tôi muốn thêm hai điểm vào cuộc thảo luận:

  1. NoneThay vào đó, bạn có thể sử dụng trên một khoảng trống để chỉ định "từ đầu" hoặc "đến cuối":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'

    Điều này đặc biệt hữu ích trong các hàm, trong đó bạn không thể cung cấp một khoảng trống làm đối số:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
  2. Python có các đối tượng lát :

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'

6

Nếu myString chứa số tài khoản bắt đầu ở offset 6 và có độ dài 9, thì bạn có thể trích xuất số tài khoản theo cách này : acct = myString[6:][:9].

Nếu OP chấp nhận điều đó, họ có thể muốn thử, theo kiểu thử nghiệm,

myString[2:][:999999]

Nó hoạt động - không có lỗi nào được nêu ra và không có 'chuỗi đệm' mặc định xảy ra.


1
Tôi nghĩ rằng nếu bạn muốn sử dụng phương pháp này myString[offset:][:length]trong trường hợp OP, bạn chỉ có thể sử dụngmyString[offset:][:]
victortv

1
@VictorVal Câu trả lời dành cho những người (như tôi), người đã học Python như ngôn ngữ lập trình thứ 2 (thứ 3, thứ 4, ...) và muốn một số 'cú pháp cú pháp' quen thuộc để tiếp cận ngôn ngữ. Bất kỳ chuyên gia về ngôn ngữ rất có thể sẽ xem câu trả lời của tôi là một chút ngớ ngẩn.
CopyPasteIt

Những câu trả lời như thế này có nên được gắn cờ để xóa không? Các câu trả lời khác giải thích giải pháp tương tự tốt hơn nhiều, và thấy câu trả lời này đã khiến tôi gãi đầu và tra cứu con trăn trong vài phút trước khi nhận ra rằng đó chỉ là câu trả lời kiểu đó.
Sebi

3

Có thể tôi đã bỏ lỡ nó, nhưng tôi không thể tìm thấy câu trả lời đầy đủ trên trang này cho (các) câu hỏi ban đầu vì các biến không được thảo luận thêm ở đây. Vì vậy, tôi đã phải tiếp tục tìm kiếm.

Vì tôi chưa được phép bình luận, hãy để tôi thêm kết luận của tôi ở đây. Tôi chắc chắn mình không phải là người duy nhất quan tâm đến nó khi truy cập trang này:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

Nếu bạn rời khỏi phần đầu tiên, bạn nhận được

 >>>myString[:end]
 'Hello' 

Và nếu bạn để lại: ở giữa, bạn cũng có chuỗi con đơn giản nhất, đó sẽ là ký tự thứ 5 (đếm bắt đầu bằng 0, vì vậy nó là khoảng trống trong trường hợp này):

 >>>myString[end]
 ' '

1

Chà, tôi có một tình huống cần dịch một đoạn script PHP sang Python và nó có nhiều cách sử dụng substr(string, beginning, LENGTH).
Nếu tôi chọn Python, string[beginning:end]tôi sẽ phải tính toán rất nhiều chỉ mục cuối, vì vậy cách dễ dàng hơn là sử dụng string[beginning:][:length], nó đã giúp tôi tiết kiệm rất nhiều rắc rối.


0

Sử dụng các chỉ mục mã hóa cứng có thể là một mớ hỗn độn.

Để tránh điều đó, Python cung cấp một đối tượng tích hợp slice().

string = "my company has 1000$ on profit, but I lost 500$ gambling."

Nếu chúng tôi muốn biết tôi còn lại bao nhiêu tiền.

Giải pháp bình thường:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Sử dụng lát:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

Sử dụng lát bạn có thể đọc được.


5
Có thể đây không phải là ví dụ tốt nhất, bởi vì các chỉ mục được mã hóa cứng vẫn còn và khả năng đọc đến từ các biến trung gian, mà bạn có thể đã sử dụng trong ví dụ đầu tiên.
ASalazar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.