Как получить подстроку строки в Python?

2145

Есть ли способ подстроки строки в 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"

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

Endophage
источник
21
@mtahmed абсолютно связан с вопросом. Что если вы хотите подстроку, выбрав в строке альтернативные символы? Это будет my_string [:: 2]
Endophage
Я думаю, что более вероятно, что вы хотели упомянуть третий параметр для нарезки. Необходимость получения любого другого символа из строки может быть важным вариантом использования где-то, но мне никогда не приходилось это делать. Не то, чтобы было что-то не так с желанием похвастаться тем, что вы знаете - какой смысл знать вещи, если вы не можете этого сделать. :) Но аргументы в пользу актуальности вопроса завышены.
Джон Локвуд
1
Несомненно, конкретный пример выбора альтернативных символов может не относиться к вопросу, но понимание того, что существует очень важный третий параметр для нарезки, уместно, и простые примеры служат для иллюстрации того, как это работает. Сообщество Python также имеет большую историю обучения новых членов в дружеской обстановке :-)
Endophage
127

Substr () обычно (т.е. PHP и Perl) работает следующим образом:

s = Substr(s, beginning, LENGTH)

Так что параметры есть beginningи LENGTH.

Но поведение Python другое; он ожидает начала и одного после END (!). Это трудно заметить начинающим. Таким образом, правильная замена для Substr (s, начало, LENGTH)

s = s[ beginning : beginning + LENGTH]
Михал Леон
источник
76
Начинающие должны учиться питоническому способу при переходе на питон, а не придерживаться других языковых привычек
Нику Сурду
3
И просто для полноты, Java похож на Python в том, что метод String.substring () принимает начало и один конец. Это немного меня задело, я предположил, что это длина, как и у любой другой функции подстроки в мире.
PhilHibbs
4
(Возможно) более питонский способ сделать этоs[beginning:][:length]
victortv
2
Как человек, который начал с Python вместо [грязных слов] -языков, таких как PHP, я думаю, что Python намного более прост и интуитивно понятен со своей строкой [начало: конец]. Длина вообще не актуальна.
Gloweye
60

Распространенным способом достижения этого является нарезка строк.

MyString[a:b] выдает подстроку из индекса a в (b - 1).

codingscientist
источник
23

Один пример здесь отсутствует: полная (мелкая) копия.

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

Это общая идиома для создания копии типов последовательностей (не интернированных строк), [:]. Мелкие копии списка, см. Синтаксис фрагмента списка Python, используемый без видимой причины .

гимель
источник
12
Это почти не имеет отношения к вопросу о подстроке. Даже не относится к строке. Достаточно сказать stringA = stringB ...
Нику Сурду
2
Полная копия [:] создает новую копию, использует синтаксис среза и читается как «подстрока от начала до конца»
gimel
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'

Обратите внимание, что мы включаем начало в срез, но мы идем только до остановки, не включая ее.

Когда step is 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'
ostrokach
источник
6

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

Если ФП признает это, они, возможно, захотят попробовать экспериментальным путем:

myString[2:][:999999]

Это работает - никакой ошибки не возникает, и по умолчанию «заполнение строк» ​​не происходит.

CopyPasteIt
источник
1
Я думаю, что если вы хотите использовать этот метод myString[offset:][:length]в случае OP, вы можете просто использоватьmyString[offset:][:]
victortv
1
@VictorVal Ответ предназначен для тех (как я), которые изучили Python как 2-й (3-й, 4-й, ...) язык и хотят использовать знакомые "синтаксические хуки", чтобы приблизиться к языку. Любые эксперты по языку, скорее всего, посчитают мой ответ немного глупым.
CopyPasteIt
Должны ли такие ответы быть помечены для удаления? Другие ответы объясняют подобное решение гораздо лучше, и, увидев это, я на несколько минут почесал голову и посмотрел на python, прежде чем понял, что это просто ответ такого типа.
Себи
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, 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

Используя слайс, вы получаете удобочитаемость.

Levi
источник
5
Возможно, это не лучший пример, потому что жестко закодированные индексы остаются, а читаемость исходит из промежуточных переменных, которые вы могли бы использовать в первом примере.
Асалазар