Як отримати підрядок рядка в Python?


2143

Чи є спосіб замінити рядок у Python, щоб отримати нову рядок від третього символу до кінця рядка?

Може, як myString[2:end]?

Якщо вийти з другої частини означає «до кінця», а якщо ви залишите першу частину, це починається з початку?


1
Це містить чітке пояснення pythoncentral.io/cutting-and-slicing-strings-in-python
mario ruiz

Відповіді:


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

Python називає це поняття "нарізкою", і воно працює на більш ніж просто рядках. Погляньте тут на всебічне вступ.


401

Тільки для повноти, як ніхто інший цього не згадував. Третій параметр для фрагмента масиву - це крок. Тож обертання рядка настільки ж просто, як:

some_string[::-1]

Або вибір альтернативних символів буде таким:

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

Можливість крокувати вперед і назад по рядку підтримує послідовність з можливістю масиву фрагмента з початку або в кінці.


21
@mtahmed абсолютно пов'язаний із питанням. Що робити, якщо ви хотіли підстрочку, вибравши альтернативні символи з рядка? Це був би мій стринг [:: 2]
Endophage

Я думаю, що більш ймовірно, що ви хотіли згадати третій параметр для зрізу. Необхідність діставати будь-який інший символ із рядка може бути десь важливим випадком використання, але мені ніколи цього не доводилося робити. Не те, що є щось погано в тому, щоб хотіти показати те, що ви знаєте - який сенс знати речі, якщо ви цього не можете зробити. :) Але справа щодо актуальності цього питання завищена.
Джон Локвуд

1
Звичайно, конкретний приклад вибору альтернативних символів може не мати відношення до питання, але розуміння того, що існує третій параметр для нарізки дуже важливий, а прості приклади служать для ілюстрації того, як це працює. У спільноті Python також є чудова історія дружнього навчання нових членів :-)
Endophage

127

Substr () зазвичай (тобто PHP і Perl) працює таким чином:

s = Substr(s, beginning, LENGTH)

Отже параметри є beginningі LENGTH.

Але поведінка Пітона інша; він очікує початку і один після END (!). Це початківцям важко помітити. Тож правильна заміна Substr (s, початок, LENGTH) є

s = s[ beginning : beginning + LENGTH]

75
Початківцям слід навчитися пітонічному шляху, переходячи на пітон, не дотримуватися інших мовних звичок
Ніку Сурду

3
І тільки для повноти, Java схожий на Python в тому, що метод String.substring () приймає старт і завершення. Цей мене просто важко покусав, я вважав, що це довжина, як і будь-яка інша підстрокова функція у світі.
PhilHibbs

4
(Ймовірно) більш пітонічний спосіб це зробитиs[beginning:][:length]
victortv

2
Оскільки хтось, хто почав з Python замість [брудного слова] -мовні позначення на зразок PHP, я думаю, що Python набагато простіший та інтуїтивніший зі своїм рядком [початок: кінець]. Довжина, як правило, не актуальна.
Gloweye

60

Поширений спосіб досягти цього - нарізання струн.

MyString[a:b] дає підрядку від індексу a до (b - 1).


23

Один приклад, здається, тут відсутній: повна (неглибока) копія.

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

Це загальна ідіома для створення копії типів послідовностей (НЕ інтернованих рядків), [:]. Дрібно копіює список, див. Синтаксис фрагмента списку Python, який використовується без очевидних причин .


12
Це майже не має нічого спільного з питанням про підрядку. Не застосовується навіть до рядка. Говорити stringA = stringB досить ...
Ніку Сурду

2
Повна копія [:] створює НОВУ КОПІЮ, використовує синтаксис
зрізів

2
Який сенс, оскільки струни незмінні? a=bмає бути достатнім.
bfontaine

1
@gimel: Насправді, [:]непорушний тип взагалі не робить копію. Хоча mysequence[:]в основному нешкідливо , коли mysequenceнепорушний тип , як str, tuple, bytes(PY3) або unicode(py2), a = b[:]еквівалентно a = b, він просто витрачає мало часу диспетчерської кодів байт нарізки яких об'єкт реагує, повертаючи себе , так як це безглуздо для дрібного копіювання , коли , окрім тестів на предмет ідентичності об'єкта, це рівносильно просто повернути ще одне посилання на своє незмінне «я».
ShadowRanger

3
Спроба підсумовувати інші критичні зауваження цієї відповіді: В Python, рядки є незмінними, тому немає ніяких причин , щоб зробити копію рядка - так s[:]робить копію на всіх: s = 'abc'; s0 = s[:]; assert s is s0. Так, це був ідіоматичний спосіб копіювання списку в Python, поки списки не отримали list.copy, але повний фрагмент непорушного типу не має підстав робити копію, оскільки його неможливо змінити, тому в пам'яті може бути лише один ми не повинні витрачати час на його копіювання. Оскільки ця відповідь неправильна і навіть не відповідає на питання - чи її слід видалити?
Аарон Холл

18

Чи існує спосіб підстрочки рядка в Python, щоб отримати нову рядок від 3-го символу до кінця рядка?

Може, як myString[2:end]?

Так, це на самому справі працює , якщо ви призначите або зв'язати , ім'я, endдля постійного одноточечного, None:

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

Позначення фрагмента має 3 важливі аргументи:

  • почати
  • Стоп
  • крок

Вони за замовчуванням не даються None- але ми можемо їх чітко передати:

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

Якщо залишити другу частину означає «до кінця», якщо ви залишите першу частину, чи починається вона з початку?

Так, наприклад:

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

Зауважте, що ми включаємо старт у фрагмент, але ми лише піднімаємось до, а не включаючи зупинку.

Коли кроком є None, за замовчуванням фрагмент використовується 1для кроку. Якщо ви перейдете з негативним цілим числом, Python досить розумний, щоб пройти від кінця до початку.

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

Я пояснюю позначення фрагментів дуже докладно у своїй відповіді на Пояснення запитання про фрагменти.


8

Ви маєте це прямо там, крім "кінця". Це називається позначення зрізів. Ваш приклад повинен читати:

new_sub_string = myString[2:]

Якщо ви випустите другий параметр, це неявно кінець рядка.


6

Я хотів би додати до дискусії два моменти:

  1. Ви можете використовувати Noneна порожньому просторі, щоб вказати "від початку" або "до кінця":

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

    Це особливо корисно у функціях, де ви не можете надати порожній простір як аргумент:

    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 є об'єкти зрізу :

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

6

Якщо туЗЬптд містить номер рахунку , який починається зі зміщенням 6 і має довжину 9, то ви можете отримати номер банківського рахунку , таким чином: acct = myString[6:][:9].

Якщо ОП приймає це, вони можуть спробувати спробувати експериментальним шляхом,

myString[2:][:999999]

Це працює - помилка не піднімається, і не виникає "забивка рядків" за замовчуванням.


1
Я думаю, що якщо ви хочете використовувати цей метод myString[offset:][:length]у випадку з ОП, ви можете просто скористатисяmyString[offset:][:]
victortv

1
@VictorVal Відповідь - це для тих (як я), які вивчили Python як 2-ю (3-ю, 4-ю, ...) мовою програмування і хочуть, щоб деякі знайомі "гачки синтаксису" підходили до мови. Будь-які фахівці з мови, швидше за все, сприйматимуть мою відповідь трохи нерозумно.
CopyPasteIt

Чи слід позначити такі відповіді для видалення? Інші відповіді пояснюють подібне рішення набагато краще, і побачивши, що це змусило мене почухати голову та пошукати пітона протягом декількох хвилин, перш ніж зрозуміти, що це саме такий тип відповіді.
Sebi

3

Можливо, я пропустив це, але я не зміг знайти повної відповіді на цій сторінці на оригінальні питання, тому що змінні тут далі не обговорюються. Тому мені довелося продовжувати пошуки.

Оскільки мені поки що не можна коментувати, дозвольте тут додати свій висновок. Я впевнений, що я не був єдиним, хто зацікавився цим доступом до цієї сторінки:

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

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

Якщо ви залишите першу частину, ви отримаєте

 >>>myString[:end]
 'Hello' 

І якщо ви залишили: у середині ви також отримали найпростішу підрядку, яка була б 5-м символом (рахуйте, починаючи з 0, тож у цьому випадку це порожнє):

 >>>myString[end]
 ' '

1

Ну, у мене виникла ситуація, коли мені потрібно було перекласти PHP-скрипт на Python, і це було багато звичаїв substr(string, beginning, LENGTH).
Якби я вибрав Python's, string[beginning:end]я повинен був би обчислити багато кінцевих індексів, тому більш простим способом було використання string[beginning:][:length], це врятувало мені багато клопоту.


0

Використання твердо кодованих індексів само по собі може бути безладно.

Щоб уникнути цього, Python пропонує вбудований об’єкт slice().

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

Якщо ми хочемо знати, скільки грошей у мене залишилось.

Звичайне рішення:

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

Використання скибочок:

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

Використовуючи фрагмент, ви отримуєте читабельність.


5
Можливо, це не найкращий приклад, оскільки індекси з твердим кодом залишаються, а читабельність - з проміжних змінних, які ви могли використовувати в першому прикладі.
ASalazar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.