Строковые методы в Python

Завершено

Строковые методы являются одним из наиболее распространенных типов методов в Python. Для извлечения информации или соответствия определенному формату часто требуется управлять строками. Python включает в себя несколько строковых методов, предназначенных для наиболее распространенных и полезных преобразований.

Строковые методы являются частью типа str. Это означает, что методы существуют в виде строковых переменных или непосредственно части строки. Например, метод .title() возвращает строку в начальных крышках и может использоваться непосредственно со строкой:

print("temperatures and facts about the moon".title())

Выходные данные: Temperatures And Facts About The Moon

Такое же поведение и использование происходит в переменной:

heading = "temperatures and facts about the moon"
heading_upper = heading.title()
print(heading_upper)

Разбиение строки

Распространенным строковым методом является .split(). Без аргументов этот метод разделит строку по каждому пробелу. При этом будет создан список всех слов или цифр, отделенных пробелом:

temperatures = "Daylight: 260 F Nighttime: -280 F"
temperatures_list = temperatures.split()
print(temperatures_list)

Выходные данные: ['Daylight:', '260', 'F', 'Nighttime:', '-280', 'F']

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

temperatures = "Daylight: 260 F\n Nighttime: -280 F"
temperatures_list = temperatures.split('\n')
print(temperatures_list)

Выходные данные: ['Daylight: 260 F', 'Nighttime: -280 F']

Этот тип разделения удобно, когда требуется цикл для обработки или извлечения информации, или при загрузке данных из текстового файла.

Поиск строки

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

Самый простой способ определить, существует ли данное слово, символ или группа символов в строке, — использовать in оператор:

print("Moon" in "This text will describe facts and challenges with space travel")

Выходные данные: False

print("Moon" in "This text will describe facts about the Moon")

Выходные данные: True

Подход к поиску позиции определенного слова в строке заключается в использовании метода .find():

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.find("Moon"))

Выходные данные: -1

Метод .find() возвращает значение -1, если слово не найдено, либо возвращает индекс (число, обозначающее место в строке). Вот как это будет работать при поиске слова Mars (Марс):

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.find("Mars"))

Выходные данные: 64

64 — это позиция, в которой в строке отображается "Mars".

Другой способ поиска содержимого заключается в использовании метода .count(), который возвращает общее число вхождений определенного слова в строке:

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.count("Mars"))
print(temperatures.count("Moon"))
1
0

Строки в Python чувствительны к регистру, что означает, что Луна и луна считаются разными словами. Чтобы выполнить сравнение без учета регистра, можно преобразовать строку в строчные буквы с помощью метода .lower():

print("The Moon And The Earth".lower())

Выходные данные: the moon and the earth

Аналогично методу .lower() для строк есть метод .upper(), который делает противоположное, преобразуя каждый символ в верхний регистр:

print("The Moon And The Earth".upper())

Выходные данные: THE MOON AND THE EARTH

Совет

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

Проверка содержимого

Иногда приходится обрабатывать текст для извлечения сведений, не имеющих единого представления. Например, следующую строку обработать проще, чем неструктурированный абзац:

temperatures = "Mars Average Temperature: -60 C"

Чтобы извлечь среднюю температуру на Марсе, можно использовать следующие методы:

temperatures = "Mars Average Temperature: -60 C"
parts = temperatures.split(':')
print(parts)
print(parts[-1])
['Mars average temperature', ' -60 C']
' -60 C'

Предыдущий код доверяет, что все после двоеточия (:) является температурой. Строка разделяется по :, в результате чего получается список из двух элементов. При использовании [-1] для списка возвращается последний элемент, который является температурой в этом примере.

Если текст является неоднообразным, то использовать те же методы разделения для получения значения не получится. Необходимо выполнить циклический перебор элементов и проверить, относятся ли значения к определенному типу. Python содержит методы, помогающие проверить тип строки:

mars_temperature = "The highest temperature on Mars is about 30 C"
for item in mars_temperature.split():
    if item.isnumeric():
        print(item)

Выходные данные: 30

Как и метод .isnumeric(), .isdecimal() может проверять наличие строк, выглядящих как десятичные числа.

Важно!

Может показаться удивительным, что "-70".isnumeric() возвратит False. Это связано с тем, что все символы в строке должны быть числовыми, а дефис (-) не является числом. Если необходимо проверить отрицательные числа в строке, метод .isnumeric() работать не будет.

Существуют дополнительные проверки, которые можно применять к строкам для проверки значений. Для отрицательных чисел дефис добавляется к числу в качестве префикса, что может быть обнаружено с помощью метода .startswith():

print("-60".startswith('-'))

Выходные данные: True

Аналогичным образом метод .endswith() помогает проверить последний символ строки:

if "30 C".endswith("C"):
print("This temperature is in Celsius")

Выходные данные: This temperature is in Celsius

Преобразование текста

Существуют и другие методы, которые подходят в ситуациях, когда текст нужно преобразовать в что-то другое. До сих пор вы видели строки, в которых может использоваться буква C для градусов Цельсия и буква F для градусов Фаренгейта. Метод .replace() можно использовать для поиска и замены вхождений символа или группы символов:

print("Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius.".replace("Celsius", "C"))

Выходные данные: Saturn has a daytime temperature of -170 degrees C, while Mars has -28 C.

Как упоминалось ранее, .lower() — это хороший способ нормализации текста для поиска без учета регистра. Давайте быстро проверим, описывает ли в некоторый текст температуры:

text = "Temperatures on the Moon can vary wildly."
print("temperatures" in text)

Выходные данные: False

text = "Temperatures on the Moon can vary wildly."
print("temperatures" in text.lower())

Выходные данные: True

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

После разделения текста и выполнения преобразований, возможно, потребуется снова объединить все части. Так же, как метод .split() может разделять символы, метод .join() может соединить их обратно.

Методу .join() требуется итерируемое значение (например, список Python) в качестве аргумента, поэтому его использование отличается от других строковых методов:

moon_facts = ["The Moon is drifting away from the Earth.", "On average, the Moon is moving about 4cm every year."]
print(' '.join(moon_facts))

Выходные данные: The Moon is drifting away from the Earth. On average, the Moon is moving about 4cm every year.

В этом примере ' ' используется для присоединения каждого элемента в списке.