Как вставить строку в Python? - PullRequest
1869 голосов
/ 19 марта 2009

Есть ли способ подстроки строки в Python, чтобы получить новую строку от 3-го символа до конца строки?

Может быть, как myString[2:end]?

Если выход из второй части означает «до конца», если вы выходите из первой части, начинается ли она с самого начала?

Ответы [ 11 ]

2809 голосов
/ 19 марта 2009
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python называет эту концепцию "нарезкой", и она работает не только над строками. Взгляните здесь для всестороннего ознакомления.

344 голосов
/ 20 марта 2012

Просто для полноты, как никто другой не упомянул об этом. Третий параметр среза массива - это шаг. Таким образом, обращение строки так же просто, как:

some_string[::-1]

Или выбор альтернативных символов будет:

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

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

107 голосов
/ 04 августа 2012

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

s = Substr(s, beginning, LENGTH)

Значит, параметры beginning и LENGTH.

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

s = s[ beginning : beginning + LENGTH]
50 голосов
/ 02 марта 2012

Обычный способ добиться этого - нарезка строк.

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

20 голосов
/ 19 марта 2009

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

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

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

17 голосов
/ 24 июня 2017

Есть ли способ подстроки строки в Python, чтобы получить новую строку от 3-го символа до конца строки?

Может быть, как myString[2:end]?

Да, на самом деле это работает, если вы присваиваете или связываете имя end постоянному синглтону None:

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

Запись среза имеет 3 важных аргумента:

  • 1018 * начать *
  • остановка

Их значения по умолчанию, если они не указаны, 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 голосов
/ 19 марта 2009

Вы получили это прямо здесь, за исключением "конца". Это называется обозначение среза. Ваш пример должен читать:

new_sub_string = myString[2:]

Если вы пропустите второй параметр, это неявно будет конец строки.

6 голосов
/ 31 августа 2016

Я бы хотел добавить к обсуждению два момента:

  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'
    
3 голосов
/ 18 марта 2015

Возможно, я пропустил это, но я не смог найти полный ответ на этой странице на первоначальный вопрос (-ы), потому что переменные здесь больше не обсуждаются. Поэтому мне пришлось продолжить поиск.

Поскольку мне пока не разрешено комментировать, позвольте мне добавить свое заключение здесь. Я уверен, что я был не единственным, кто заинтересовался этим при доступе к этой странице:

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

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

Если вы оставите первую часть, вы получите

 >>>myString[:end]
 'Hello' 

И если вы оставите: посередине, вы получите простейшую подстроку, которая будет 5-м символом (отсчет начинается с 0, поэтому в данном случае это пробел):

 >>>myString[end]
 ' '
0 голосов
/ 17 февраля 2019

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

Если ОП принимает это, они могут попробовать экспериментальным путем

myString[2:][:999999]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...