it-swarm.com.ru

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

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

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

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

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

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

2671
Paolo Bergantino

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

some_string[::-1]

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

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

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

327
Endophage

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

s = Substr(s, beginning, LENGTH)

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

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

s = s[ beginning : beginning + LENGTH]
102
Michał Leon

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

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

47
codingscientist

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

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

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

17
gimel

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

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

Да, это на самом деле работает, если вы присваиваете, или bind , имя, end, константе singleton, 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
Aaron Hall

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

new_sub_string = myString[2:]

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

8
bouvard

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

  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
ostrokach

Это довольно просто:

s = 'Hello, World!'
print(s[:]) # prints "Hello, World!"
print(s[:5]) # prints Hello
print(s[5:]) # prints , World!
print(s[3:7]) # prints "lo, "
4
Muskovets

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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '
3
Rudi Uhl

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

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

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

0
levi

На основе ответа @CopyPastelt, если вы хотите подстроку на основе смещения и длины:

def substring(s, offset=None, length=None):
    return s[offset:][:length]

Пример использования:

string = 'Hello Beautiful World'
substring(string) #returns 'Hello Beautiful World'
substring(string,length=5) #returns 'Hello'
substring(string,6,9) #returns 'Beautiful'
substring(string,16) #returns 'World'
0
Victor Val

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

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

myString[2:][:999999]

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

0
CopyPasteIt