Питання Чи є спосіб підстроювання рядка в Python?


Чи існує спосіб підстроювання рядка в Python, щоб отримати новий рядок від 3-го символу до кінця рядка?

Може, як myString[2:end]?

Якщо залишити другу частину означає "до кінця", якщо ви вийдете з першої частини, чи починати з самого початку?


1595
2018-03-19 17:29


походження


Цей містить чітке пояснення pythoncentral.io/cutting-and-slicing-strings-in-python - Mario Ruiz


Відповіді:


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

Python називає цю концепцію "нарізанням", і вона працює не просто на рядках. Поглянь тут для всебічного введення.


2417
2018-03-19 17:30





Просто для повноти, як ніхто не згадав про це. Третім параметром до фрагмента масиву є крок. Таким чином, зміна рядка настільки ж проста, як:

some_string[::-1]

Або виділити чергові символи:

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

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


305
2018-03-20 00:58



@mtahmed абсолютно пов'язаний з питанням. Що робити, якщо ви хочете підстрокувати, вибравши чергові символи з рядка? Це буде my_string [:: 2] - Endophage
Я думаю, що, швидше за все, ви хочете згадати третій параметр до фрагмента. Потрібно отримати кожен інший символ із рядка, що може бути важливим випадком, але я ніколи не мав це робити. Не те, що є щось погане, прагнучи продемонструвати те, що ти знаєш, - що означає знати речі, якщо ви цього не можете зробити. :) Але справа щодо відповідності до питання завищена. - John Lockwood
Звичайно, конкретний приклад вибору альтернативних символів може не відповідати питанню, але зрозуміло, що третій параметр для нарізки дуже важливий, і прості приклади служать для ілюстрації того, як це працює. Спільнота Python також має чудову історію навчань нових членів дружньо :-) - Endophage


Substr () зазвичай (наприклад, PHP і Perl) працює таким чином:

s = Substr(s, beginning, LENGTH)

Отже, параметри є beginning і LENGTH.

Але поведінка Пітона є іншою; він очікує початок і один після END (!). Це важко визначити початківцями. Отже, правильна заміна Substr (s, початок, LENGTH) є

s = s[ beginning : beginning + LENGTH]

92
2017-08-04 11:43



Початківці повинні вивчати пітонічний спосіб, коли переходять на python, не дотримуючись інших мовних звичок - Nicolae Surdu


Найпоширенішим способом досягнення цієї мети є розрізання рядком. MyString[a:b] дає вам підрядку від індексу а до (б - 1)


45
2018-03-02 05:19



простий і легкий. Дякую - Jacky Supit


Здається, тут відсутній один приклад: повна (неглибока) копія.

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

Це загальний ідіом для створення копії типів послідовностей (а не інтернованих рядків). [:] Неповний копіює список, див python-list-slice-used-for-no-obvious-reason.


17
2018-03-19 18:02



Це майже не має відношення до питання про підрядку. Не застосовується навіть до рядка. Вислів stringA = stringB досить ... - Nicolae Surdu
Повна копія [:] створює НОВУ КОПІЮ, використовує синтаксис скидання і читається як "підрядка від початку до кінця" - gimel
Що таке точка, оскільки рядки незмінні? a=b має бути достатньо. - bfontaine
@gimel: Насправді [:] на незмінному типі взагалі не робить копію. Поки mysequence[:] в основному нешкідливий, коли mysequence це незмінний тип, як str, tuple, bytes (Py3) або unicode (Py2), a = b[:] еквівалентно a = b, він просто витрачає деякий час на відправку кодів байт-розрізання, на які об'єкт реагує, повертаючи себе самостійно, тому що, крім випробувань ідентичності об'єктів, це не має сенсу, це просто еквівалентно поверненню іншого посилання на незмінне я. - ShadowRanger
Спробую підвести підсумки інших критичних зауважень цієї відповіді: у Python рядки незмінні, тому немає підстав зробити копію рядка - так s[:] не робить копію взагалі: s = 'abc'; s0 = s[:]; assert s is s0. Так, це був ідіоматичний спосіб копіювати список у Python до тих пір, поки не отримано списки list.copy, але повний фрагмент незмінного типу не має причин робити копію, оскільки її неможливо змінити, тому може бути і лише один у пам'яті, і ми не повинні втрачати час копіювання. Оскільки ця відповідь є неправильною і навіть не відповідає на питання - чи слід його видалити? - Aaron Hall♦


Чи існує спосіб підстроювання рядка в 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'

Зверніть увагу, що ми включимо початок у скибочку, але ми лише піднімаємось, але не зупиняємо.

Коли крок є None, за замовчуванням використовується фрагмент 1 за крок Якщо ви крокуєте з від'ємним цілим числом, Python досить розумний, щоб перейти від кінця до початку.

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

Я докладно пояснюю фрагмент нотації в деталях моя відповідь на пояснення фрагментації запитання. 


13
2018-06-23 21:53





Ви отримали це прямо тут, крім "кінця". Це називається позначенням фрагмента. Ваш приклад слід прочитати:

new_sub_string = myString[2:]

Якщо ви вийдете з другого параметра, це неявно є кінцем рядка.


7
2018-03-19 17:31





Я хотів би додати два пункти до обговорення:

  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. Пітон має скибочка об'єкти:

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

6
2017-08-31 04:28





Може бути, я пропустив це, але я не міг знайти повну відповідь на цю сторінку на оригінальні питання, оскільки змінні тут ще не обговорюються. Тому мені довелося піти на пошуки.

Оскільки мені ще не дозволено коментувати, дозвольте мені додати свій висновок тут. Я впевнений, що, перейшовши на цю сторінку, я не був єдиним, кого це цікавить.

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

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

Якщо ви залишите першу частину, ви отримаєте

 >>>myString[:end]
 'Hello' 

І якщо ви залишили: у середині, то ви отримали найпростішу підрядку, яка буде 5-м символом (кількість починається з 0, так що в цьому випадку це порожнє):

 >>>myString[end]
 ' '

2
2018-03-18 12:01