Bagaimana cara mendapatkan substring dari string dengan Python?

2144

Apakah ada cara untuk mensubstring string dengan Python, untuk mendapatkan string baru dari karakter ketiga ke akhir string?

Mungkin suka myString[2:end]?

Jika meninggalkan bagian kedua berarti 'sampai akhir', dan jika Anda meninggalkan bagian pertama, apakah itu dimulai dari awal?

Joan Venge
sumber
1
Yang ini mengandung penjelasan yang jelas pythoncentral.io/cutting-and-slicing-strings-in-python
mario ruiz

Jawaban:

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

Python menyebut konsep ini "mengiris" dan berfungsi lebih dari sekadar string. Lihatlah di sini untuk pengantar yang komprehensif.

Paolo Bergantino
sumber
401

Hanya untuk kelengkapan karena tidak ada orang lain yang menyebutkannya. Parameter ketiga ke irisan array adalah langkah. Jadi membalikkan string itu sesederhana:

some_string[::-1]

Atau memilih karakter alternatif adalah:

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

Kemampuan untuk melangkah maju dan mundur melalui string mempertahankan konsistensi dengan mampu menyusun irisan dari awal atau akhir.

Endofag
sumber
21
@ mtahmed benar-benar terkait dengan pertanyaan. Bagaimana jika Anda ingin substring dengan memilih karakter alternatif dari string? Itu akan menjadi my_string [:: 2]
Endophage
Saya pikir lebih mungkin Anda ingin menyebutkan parameter ketiga untuk diiris. Perlu untuk mendapatkan setiap karakter lain dari sebuah string dapat menjadi kasus penggunaan yang penting di suatu tempat, tetapi saya belum pernah melakukannya. Bukannya ada yang salah dengan keinginan untuk memamerkan apa yang Anda ketahui - apa gunanya mengetahui sesuatu jika Anda tidak bisa melakukan itu. :) Tapi kasus untuk relevansi dengan pertanyaan itu terlalu berlebihan.
John Lockwood
1
Tentu, contoh spesifik untuk memilih karakter alternatif mungkin tidak relevan dengan pertanyaan, tetapi memahami ada parameter ke-3 untuk mengiris sangat relevan dan contoh sederhana berfungsi untuk menggambarkan cara kerjanya. Komunitas Python juga memiliki sejarah yang hebat dalam mendidik anggota baru dengan cara yang ramah :-)
Endophage
127

Substr () biasanya (yaitu PHP dan Perl) bekerja dengan cara ini:

s = Substr(s, beginning, LENGTH)

Jadi parameternya adalah beginningdan LENGTH.

Tetapi perilaku Python berbeda; ia mengharapkan awal dan satu setelah AKHIR (!). Ini sulit dikenali oleh pemula. Jadi pengganti yang tepat untuk Substr (s, awal, LENGTH) adalah

s = s[ beginning : beginning + LENGTH]
Michał Leon
sumber
76
Para pemula harus belajar cara pythonic ketika pindah ke python, tidak tetap pada kebiasaan bahasa lainnya
Nicu Surdu
3
Dan hanya untuk kelengkapan, Java seperti Python dalam metode String.substring () mengambil mulai dan satu-melewati-akhir. Yang ini menggigit saya dengan keras, saya berasumsi panjangnya seperti fungsi substring lainnya di dunia.
PhilHibbs
4
Cara (mungkin) yang lebih pythonic untuk melakukan itu adalahs[beginning:][:length]
victortv
2
Sebagai seseorang yang mulai dengan Python bukannya [kata kotor] -bahasa seperti PHP, saya pikir Python jauh lebih sederhana dan intuitif dengan string [awal: akhir]. Panjang umumnya tidak relevan.
Gloweye
60

Cara yang umum untuk mencapai ini adalah dengan mengiris tali.

MyString[a:b] memberi Anda substring dari indeks a ke (b - 1).

ahli ilmu kode
sumber
23

Satu contoh tampaknya hilang di sini: salinan lengkap (dangkal).

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

Ini adalah ungkapan umum untuk membuat salinan tipe urutan (bukan string yang diinternir) [:],. Dangkal menyalin daftar, lihat sintaks slice daftar Python digunakan tanpa alasan yang jelas .

Gimel
sumber
12
Ini hampir tidak ada hubungannya dengan pertanyaan tentang substring. Bahkan tidak berlaku untuk string. Mengatakan stringA = stringB sudah cukup ...
Nicu Surdu
2
Salinan lengkap [:] membuat COPY BARU, menggunakan sintaksis slice dan dibaca sebagai "substring from start to end"
gimel
2
Apa gunanya karena string tidak dapat diubah? a=bharus cukup.
bfontaine
1
@ gimel: Sebenarnya, [:]pada tipe yang tidak berubah sama sekali tidak membuat salinan. Sementara mysequence[:]sebagian besar tidak berbahaya ketika mysequenceadalah jenis berubah seperti str, tuple, bytes(Py3) atau unicode(Py2), a = b[:]setara dengan a = b, itu hanya limbah sedikit waktu pengiriman kode byte mengiris mana objek merespon untuk dengan kembali sendiri sejak gunanya itu untuk copy dangkal saat , selain dari tes identitas objek, itu setara dengan hanya mengembalikan referensi lain ke diri yang kekal seseorang.
ShadowRanger
3
Mencoba untuk meringkas kritik lain dari jawaban ini: Dalam Python, string yang berubah, karena itu tidak ada alasan untuk membuat salinan string - sehingga s[:]tidak membuat salinan sama sekali: s = 'abc'; s0 = s[:]; assert s is s0. Ya itu adalah cara idiomatis untuk menyalin daftar dengan Python hingga daftar didapat list.copy, tetapi sepotong penuh dari tipe yang tidak dapat diubah tidak memiliki alasan untuk membuat salinan karena tidak dapat diubah, jadi mungkin hanya ada satu di memori dan kita seharusnya tidak membuang waktu menyalinnya. Karena jawaban ini salah dan bahkan tidak menjawab pertanyaan - haruskah itu dihapus?
Aaron Hall
18

Apakah ada cara untuk mensubstring string dengan Python, untuk mendapatkan string baru dari karakter ke-3 ke akhir string?

Mungkin suka myString[2:end]?

Ya, ini benar-benar bekerja jika Anda menetapkan, atau mengikat , nama, end, untuk tunggal konstan, None:

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

Notasi slice memiliki 3 argumen penting:

  • Mulailah
  • berhenti
  • langkah

Standarnya saat tidak diberikan adalah None- tetapi kami dapat meneruskannya secara eksplisit:

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

Jika meninggalkan bagian kedua berarti 'sampai akhir', jika Anda meninggalkan bagian pertama, apakah ini dimulai dari awal?

Ya, misalnya:

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

Perhatikan bahwa kami menyertakan mulai di slice, tetapi kami hanya naik, dan tidak termasuk, berhenti.

Ketika langkah ini None, secara default slice menggunakan 1untuk langkah tersebut. Jika Anda melangkah dengan bilangan bulat negatif, Python cukup pintar untuk beralih dari akhir ke awal.

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

Saya menjelaskan notasi irisan dengan sangat rinci dalam jawaban saya untuk Menjelaskan irisan notasi Pertanyaan.

Aaron Hall
sumber
8

Anda sudah mendapatkannya di sana kecuali "akhir". Ini disebut notasi irisan. Contoh Anda harus membaca:

new_sub_string = myString[2:]

Jika Anda meninggalkan parameter kedua itu secara implisit adalah akhir dari string.

bouvard
sumber
6

Saya ingin menambahkan dua poin ke diskusi:

  1. Anda dapat menggunakan Nonesebagai gantinya di ruang kosong untuk menentukan "dari awal" atau "sampai akhir":

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

    Ini sangat membantu dalam fungsi, di mana Anda tidak dapat memberikan ruang kosong sebagai argumen:

    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 memiliki objek slice :

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

Jika myString berisi nomor rekening yang dimulai pada offset 6 dan memiliki panjang 9, maka Anda dapat mengekstrak nomor rekening cara ini: acct = myString[6:][:9].

Jika OP menerima itu, mereka mungkin ingin mencoba, secara eksperimental,

myString[2:][:999999]

Ini berfungsi - tidak ada kesalahan yang muncul, dan tidak ada 'string padding' standar terjadi.

CopyPasteIt
sumber
1
Saya pikir jika Anda ingin menggunakan metode ini myString[offset:][:length]dalam kasus OP Anda hanya dapat menggunakanmyString[offset:][:]
victortv
1
@VictorVal Jawabannya adalah bagi mereka (seperti saya) yang telah belajar bahasa pemrograman Python sebagai bahasa pemrograman ke-2 (ke-3, ke-4, ...) dan ingin beberapa 'kait sintaks' yang akrab untuk mendekati bahasa tersebut. Pakar bahasa apa pun kemungkinan besar akan menganggap jawaban saya agak konyol.
CopyPasteIt
Haruskah jawaban seperti ini ditandai untuk dihapus? Jawaban lain menjelaskan solusi serupa jauh lebih baik, dan melihat yang satu ini telah membuat saya menggaruk kepala dan mencari python selama beberapa menit sebelum menyadari bahwa itu hanya jawaban jenis itu.
Sebi
3

Mungkin saya melewatkannya, tetapi saya tidak dapat menemukan jawaban lengkap di halaman ini untuk pertanyaan awal karena variabel tidak dibahas lebih lanjut di sini. Jadi saya harus terus mencari.

Karena saya belum diizinkan untuk berkomentar, izinkan saya menambahkan kesimpulan saya di sini. Saya yakin saya bukan satu-satunya yang tertarik ketika mengakses halaman ini:

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

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

Jika Anda meninggalkan bagian pertama, Anda dapatkan

 >>>myString[:end]
 'Hello' 

Dan jika Anda meninggalkan: di tengah juga Anda mendapatkan substring paling sederhana, yang akan menjadi karakter ke-5 (hitung dimulai dengan 0, jadi kosong dalam kasus ini):

 >>>myString[end]
 ' '
Rudi Uhl
sumber
1

Yah, saya punya situasi di mana saya perlu menerjemahkan skrip PHP ke Python, dan ada banyak penggunaan substr(string, beginning, LENGTH).
Jika saya memilih Python, string[beginning:end]saya harus menghitung banyak indeks akhir, jadi cara yang lebih mudah adalah menggunakan string[beginning:][:length], itu menyelamatkan saya dari banyak masalah.

Edson Horacio Junior
sumber
0

Menggunakan indeks hardcoded itu sendiri bisa berantakan.

Untuk menghindarinya, Python menawarkan objek bawaan slice().

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

Jika kita ingin tahu berapa banyak uang yang tersisa.

Solusi normal:

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

Menggunakan irisan:

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

Menggunakan slice Anda mendapatkan keterbacaan.

pungutan
sumber
5
Mungkin ini bukan contoh terbaik, karena indeks hardcod tetap dan keterbacaan berasal dari variabel perantara, yang bisa Anda gunakan dalam contoh pertama.
ASalazar