11 Вопрос: Как вставить строку в Python?

вопрос создан в Wed, Apr 24, 2019 12:00 AM

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

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

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

    
1884
  1. Этот документ содержит четкое объяснение pythoncentral.io/cutting-and-slicing-strings-in-python
    2018-03-21 17: 29: 30Z
11 ответов                              11                         
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

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

    
2824
2017-05-23 12: 34: 51Z

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

some_string[::-1]

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

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

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

    
346
2019-01-04 23: 55: 10Z
  1. @ mtahmed абсолютно связан с вопросом. Что если вы хотите подстроку, выбрав в строке альтернативные символы? Это будет my_string [:: 2]
    2013-02-12 17: 59: 22Z
  2. Я думаю, что вы, скорее всего, хотели упомянуть третий параметр для нарезки. Необходимость получения любого другого символа из строки может быть важным вариантом использования где-то, но мне никогда не приходилось это делать. Не то, чтобы было что-то не так с желанием похвастаться тем, что вы знаете - какой смысл знать вещи, если вы не можете этого сделать. :) Но аргументы в пользу актуальности вопроса завышены.
    2017-12-22 11: 03: 17Z
  3. Конечно, конкретный пример выбора альтернативных символов может не относиться к вопросу, но понимание того, что существует третий параметр для нарезки, очень актуально, и простые примеры служат чтобы проиллюстрировать, как это работает. Сообщество Python также имеет большую историю обучения новых членов в дружеской обстановке: -)
    2018-01-04 18: 47: 34Z

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

s = Substr(s, beginning, LENGTH)

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

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

s = s[ beginning : beginning + LENGTH]
    
107
2018-06-22 15: 24: 49Z
  1. При переходе на python новичкам следует учиться питонски, а не придерживаться других языковых привычек
    2013-05-29 13: 58: 35Z
  2. И просто для полноты Java похож на Python в том, что метод String.substring () принимает начало и один конец-конец. Это немного меня задело, я предположил, что это длина, как и у любой другой функции подстроки в мире.
    2019-01-10 13: 34: 33Z
  3. (вероятно) более питонский способ сделать это - s[beginning:][:length]
    2019-03-12 22: 47: 56Z

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

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

    
50
2019-01-02 16: 24: 50Z

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

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

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

    
20
2019-01-02 16: 23: 47Z
  1. Это почти не имеет отношения к вопросу о подстроке. Даже не относится к строке. Сказать stringA = stringB достаточно ...
    2013-05-29 13: 48: 27Z
  2. Полная копия [:] создает новую копию, использует синтаксис среза и читается как "подстрока от начала до конца"
    2013-05-29 14: 31: 21Z
  3. Какой смысл, поскольку строки неизменяемы? a=b должно быть достаточно.
    2016-12-30 21: 21: 29Z
  4. @ gimel: На самом деле, [:] для неизменяемого типа вообще не делает копию. В то время как mysequence[:] в основном безвредны, когда mysequence непреложный типа, как str, tuple, bytes (PY3) или unicode (py2), a = b[:] эквивалентно a = b, он просто тратит немного времени диспетчеризации нарезании байт-кодов, которые объект отвечает на возвращая Само по себе, поскольку бессмысленно копировать, когда, кроме тестов на идентичность объекта, это эквивалентно просто возвращать другую ссылку на свое неизменное Я.
    2017-06-21 19: 29: 54Z
  5. Попытка суммировать другие критические замечания этого ответа: в Python строки являются неизменяемыми, поэтому нет причин делать копию строки - так что s[:] не делает ' сделать копию вообще: s = 'abc'; s0 = s[:]; assert s is s0. Да, это был идиоматический способ копирования списка в Python, пока списки не получили list.copy, но у полного фрагмента неизменяемого типа нет причины делать копию, потому что его нельзя изменить, поэтому в памяти может быть только один, и мы не должны тратить время на его копирование. Поскольку этот ответ неверен и даже не отвечает на вопрос , следует ли его удалить?
    2017-10-25 14: 33: 11Z
  

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

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

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

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

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

    
17
2017-09-30 02: 00: 07Z

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

new_sub_string = myString[2:]

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

    
8
2018-06-22 15: 23: 28Z

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

  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
2016-12-30 22: 36: 32Z

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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '
    
3
2015-03-18 12: 01: 43Z

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

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

myString[2:][:999999]

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

    
2
2019-02-17 15: 22: 27Z
  1. Я думаю, что если вы хотите использовать этот метод myString[offset:][:length], в случае OP вы можете просто использовать myString[offset:][:]
    2019-03-12 22: 49: 21Z
  2. @ VictorVal Ответ предназначен для тех (как я), которые выучили Python как 2-й (3-й, 4-й, ...) язык и хотят немного " синтаксические хуки ', чтобы приблизиться к языку. Любые эксперты по языку, скорее всего, посчитают мой ответ немного глупым.
    2019-03-12 22: 58: 54Z
  3. Должны ли такие ответы быть помечены для удаления? Другие ответы объясняют подобное решение намного лучше, и, увидев это, я на несколько минут почесал голову и посмотрел на python, прежде чем понял, что это просто ответ такого типа.
    2019-06-12 08: 10: 11Z

Использование жестко закодированных индексов само по себе может привести к путанице.

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

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

    
- 1
2018-06-22 15: 26: 57Z
  1. Возможно, это не лучший пример, потому что жестко закодированные индексы остаются, а читаемость исходит из промежуточных переменных, которые вы могли бы использовать в первом примере.
    2017-01-25 17: 27: 51Z
источник размещен Вот