Есть ли способ подстроки строки в Python?

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

может, как myString[2:end]?

Если оставить вторую часть означает 'до конца', если оставить первую часть, она начинается с самого начала?

10 ответов


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

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


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

some_string[::-1]

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

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

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


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

s = Substr(s, beginning, LENGTH)

таким образом, параметры beginning и LENGTH.

но поведение Python отличается; он ожидает начала и одного после конца (!). это трудно заметить новичкам. таким образом, правильная замена для Substr (s, начало, длина) является

s = s[ beginning : beginning + LENGTH]

распространенным способом достижения этого является нарезка строк. MyString[a:b] дает вам подстроку из индекса a в (b-1)


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

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

Это распространенная идиома для создания копии типов последовательностей (не интернированных строк). [:] Shallow копирует список, см. python-list-slice-used-for-no-obvious-reason.


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

может, как myString[2:end]?

Да, это действительно работает, если вы назначаете или bind имя,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'

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

когда шаг None, по умолчанию slice использует 1 для шага. Если вы шагаете с отрицательным целым числом, Python достаточно умен, чтобы перейти от конца к началу.

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

Я объясняю нотацию среза очень подробно в мой ответ, чтобы объяснить срез нотации вопрос.


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

new_sub_string = myString[2:]

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


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

  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 имеет slice объекты:

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

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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '

через себя жестко индексов может быть беспорядок.

чтобы избежать этого, 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

используя slice вы получаете читаемость.