Python: поиск подстроки, операции со строками. Как выполнять поиск в строке Python?
В этой статье поговорим про строки в Python, особенности поиска, а также о том, как искать подстроку или символ в строке. Но сначала давайте вспомним основные методы для обработки строк в Python:
• isalpha(str): если строка в Python включает в себя лишь алфавитные символы, возвращается True;
• islower(str): True возвращается, если строка включает лишь символы в нижнем регистре;
• isupper(str): True, если символы строки в Python находятся в верхнем регистре;
• startswith(str): True, когда строка начинается с подстроки str;
• isdigit(str): True, когда каждый символ строки — цифра;
• endswith(str): True, когда строка в Python заканчивается на подстроку str;
• upper(): строка переводится в верхний регистр;
• lower(): строка переводится в нижний регистр;
• title(): для перевода начальных символов всех слов в строке в верхний регистр;
• capitalize(): для перевода первой буквы самого первого слова строки в верхний регистр;
• lstrip(): из строки в Python удаляются начальные пробелы;
• rstrip(): из строки в Python удаляются конечные пробелы;
• strip(): из строки в Python удаляются и начальные, и конечные пробелы;
• rjust(width): когда длина строки меньше, чем параметр width, слева добавляются пробелы, строка выравнивается по правому краю;
• ljust(width): когда длина строки в Python меньше, чем параметр width, справа от неё добавляются пробелы для дополнения значения
Обрабатываем строку в Python
Представим, что ожидается ввод числа с клавиатуры. Перед преобразованием введенной нами строки в число можно легко проверить, введено ли действительно число. Если это так, выполнится операция преобразования. Для обработки строки используем такой метод в Python, как isnumeric():
string = input("Введите какое-нибудь число: ") if string.isnumeric(): number = int(string) print(number)
Следующий пример позволяет удалять пробелы в конце и начале строки:
string = " привет мир! " string = string. strip() print(string) # привет мир!
Так можно дополнить строку пробелами и выполнить выравнивание:
print("iPhone 7:", "52000".rjust(10)) print("Huawei P10:", "36000".rjust(10))
В консоли Python будет выведено следующее:
iPhone 7: 52000 Huawei P10: 36000
Поиск подстроки в строке
Чтобы в Python выполнить поиск в строке, используют метод find(). Он имеет три формы и возвращает индекс 1-го вхождения подстроки в строку: • find(str): поиск подстроки str производится с начала строки и до её конца; • find(str, start): с помощью параметра start задаётся начальный индекс, и именно с него и выполняется поиск; • find(str, start, end): посредством параметра end задаётся конечный индекс, поиск выполняется до него.
Когда подстрока не найдена, метод возвращает -1:
welcome = "Hello world! Goodbye world!" index = welcome.find("wor") print(index) # 6 # ищем с десятого индекса index = welcome.find("wor",10) print(index) # 21 # ищем с 10-го по 15-й индекс index = welcome.find("wor",10,15) print(index) # -1
Замена в строке
Чтобы в Python заменить в строке одну подстроку на другую, применяют метод replace(): • replace(old, new): подстрока old заменяется на new; • replace(old, new, num): параметр num показывает, сколько вхождений подстроки old требуется заменить на new.
Пример замены в строке в Python:
phone = "+1-234-567-89-10" # дефисы меняются на пробелы edited_phone = phone.replace("-", " ") print(edited_phone) # +1 234 567 89 10 # дефисы удаляются edited_phone = phone.replace("-", "") print(edited_phone) # +12345678910 # меняется только первый дефис edited_phone = phone.replace("-", "", 1) print(edited_phone) # +1234-567-89-10
Разделение на подстроки в Python
Для разделения в Python используется метод split(). В зависимости от разделителя он разбивает строку на перечень подстрок. В роли разделителя в данном случае может быть любой символ либо последовательность символов. Этот метод имеет следующие формы: • split(): в роли разделителя применяется такой символ, как пробел; • split(delimeter): в роли разделителя применяется delimeter
Соединение строк в Python
Рассматривая простейшие операции со строками, мы увидели, как объединяются строки через операцию сложения. Однако есть и другая возможность для соединения строк — метод join():, объединяющий списки строк. В качестве разделителя используется текущая строка, у которой вызывается этот метод:
words = ["Let", "me", "speak", "from", "my", "heart", "in", "English"] # символ разделителя - пробел sentence = " ".join(words) print(sentence) # Let me speak from my heart in English # символ разделителя - вертикальная черта sentence = " | ".join(words) print(sentence) # Let | me | speak | from | my | heart | in | English
А если вместо списка в метод join передать простую строку, разделитель будет вставляться уже между символами:
word = "hello" joined_word = "|". join(word) print(joined_word) # h|e|l|l|o
Python | Основные методы строк
Последнее обновление: 07.12.2022
Рассмотрим основные методы строк, которые мы можем применить в приложениях:
isalpha(): возвращает True, если строка состоит только из алфавитных символов
islower(): возвращает True, если строка состоит только из символов в нижнем регистре
isupper(): возвращает True, если все символы строки в верхнем регистре
isdigit(): возвращает True, если все символы строки — цифры
isnumeric(): возвращает True, если строка представляет собой число
startswith(str): возвращает True, если строка начинается с подстроки str
endswith(str): возвращает True, если строка заканчивается на подстроку str
lower(): переводит строку в нижний регистр
upper(): переводит строку в вехний регистр
title(): начальные символы всех слов в строке переводятся в верхний регистр
capitalize(): переводит в верхний регистр первую букву только самого первого слова строки
lstrip(): удаляет начальные пробелы из строки
rstrip(): удаляет конечные пробелы из строки
strip(): удаляет начальные и конечные пробелы из строки
ljust(width): если длина строки меньше параметра width, то справа от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по левому краю
rjust(width): если длина строки меньше параметра width, то слева от строки добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по правому краю
center(width): если длина строки меньше параметра width, то слева и справа от строки равномерно добавляются пробелы, чтобы дополнить значение width, а сама строка выравнивается по центру
find(str[, start [, end]): возвращает индекс подстроки в строке. Если подстрока не найдена, возвращается число -1
replace(old, new[, num]): заменяет в строке одну подстроку на другую
split([delimeter[, num]]): разбивает строку на подстроки в зависимости от разделителя
partition(delimeter): разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов — подстрока до разделителя, разделитель и подстрока после разделителя
join(strs): объединяет строки в одну строку, вставляя между ними определенный разделитель
Например, если мы ожидаем ввод с клавиатуры числа, то перед преобразованием введенной строки в число можно проверить, с помощью метода isnumeric() введено ли в действительности число, и если так, то выполнить операцию преобразования:
string = input("Введите число: ") if string.isnumeric(): number = int(string) print(number)
Проверка, начинается или оканчивается строка на определенную подстроку:
file_name = "hello. py" starts_with_hello = file_name.startswith("hello") # True ends_with_exe = file_name.endswith("exe") # False
Удаление пробелов в начале и в конце строки:
string = " hello world! " string = string.strip() print(string) # hello world!
Дополнение строки пробелами и выравнивание:
print("iPhone 7:", "52000".rjust(10)) print("Huawei P10:", "36000".rjust(10))
Консольный вывод:
iPhone 7: 52000 Huawei P10: 36000
Поиск в строке
Для поиска подстроки в строке в Python применяется метод find(), который возвращает индекс первого вхождения подстроки в строку и имеет три формы:
find(str)
: поиск подстроки str ведется с начала строки до ее концаfind(str, start)
: параметр start задает начальный индекс, с которого будет производиться поискfind(str, start, end)
: параметр end задает конечный индекс, до которого будет идти поиск
Если подстрока не найдена, метод возвращает -1:
welcome = "Hello world! Goodbye world!" index = welcome. find("wor") print(index) # 6 # поиск с 10-го индекса index = welcome.find("wor",10) print(index) # 21 # поиск с 10 по 15 индекс index = welcome.find("wor",10,15) print(index) # -1
Замена в строке
Для замены в строке одной подстроки на другую применяется метод replace():
replace(old, new)
: заменяет подстроку old на newreplace(old, new, num)
: параметр num указывает, сколько вхождений подстроки old надо заменить на new. По умолчанию num равно -1, что соответствует первой версии метода и приводит к замене всех вхождений.
phone = "+1-234-567-89-10" # замена дефисов на пробел edited_phone = phone.replace("-", " ") print(edited_phone) # +1 234 567 89 10 # удаление дефисов edited_phone = phone.replace("-", "") print(edited_phone) # +12345678910 # замена только первого дефиса edited_phone = phone. replace("-", "", 1) print(edited_phone) # +1234-567-89-10
Разделение на подстроки
Метод split() разбивает строку на список подстрок в зависимости от разделителя. В качестве разделителя может выступать любой символ или последовательность символов. Данный метод имеет следующие формы:
split()
: в качестве разделителя используется пробелsplit(delimeter)
: в качестве разделителя используется delimetersplit(delimeter, num)
: параметр num указывает, сколько вхождений delimeter используется для разделения. Оставшаяся часть строки добавляется в список без разделения на подстроки
text = "Это был огромный, в два обхвата дуб, с обломанными ветвями и с обломанной корой" # разделение по пробелам splitted_text = text.split() print(splitted_text) print(splitted_text[6]) # дуб, # разбиение по запятым splitted_text = text. split(",") print(splitted_text) print(splitted_text[1]) # в два обхвата дуб # разбиение по первым пяти пробелам splitted_text = text.split(" ", 5) print(splitted_text) print(splitted_text[5]) # обхвата дуб, с обломанными ветвями и с обломанной корой
Еще один метод — partition() разбивает строку по разделителю на три подстроки и возвращает кортеж из трех элементов — подстрока до разделителя, разделитель и подстрока после разделителя:
text = "Это был огромный, в два обхвата дуб, с обломанными ветвями и с обломанной корой" text_parts = text.partition("дуб") print(text_parts) # ('Это был огромный, в два обхвата ', 'дуб', ', с обломанными ветвями и с обломанной корой')
Если разделитель с строке не найден, то возвращается кортеж с одной строкой.
Соединение строк
При рассмотрении простейших операций со строками было показано, как объединять строки с помощью операции сложения. Другую возможность для соединения строк представляет метод join(): он объединяет список строк. Причем текущая строка, у которой вызывается данный метод, используется в качестве разделителя:
words = ["Let", "me", "speak", "from", "my", "heart", "in", "English"] # разделитель - пробел sentence = " ".join(words) print(sentence) # Let me speak from my heart in English # разделитель - вертикальная черта sentence = " | ".join(words) print(sentence) # Let | me | speak | from | my | heart | in | English
Вместо списка в метод join можно передать простую строку, тогда разделитель будет вставляться между символами этой строки:
word = "hello" joined_word = "|".join(word) print(joined_word) # h|e|l|l|o
НазадСодержаниеВперед
Питон | Проверка наличия подстроки в заданной строке
В этой статье мы расскажем, как проверить, содержит ли строка Python другую строку или подстроку в Python. Учитывая две строки, проверьте, есть ли подстрока в данной строке или нет.
Пример 1: Ввод: Подстрока = "выродки" String="гики для гиков" Выход: да Пример 2: Ввод: Подстрока = "выродок" String="гики для гиков" Вывод: да
Есть ли в Python строка, содержащая метод подстроки
Да, проверка подстроки — одна из наиболее часто используемых задач в Python. Python использует множество методов для проверки строки, содержащей подстроку, например, find(), index(), count() и т. д. Наиболее эффективным и быстрым методом является использование оператора « в «, который используется в качестве оператора сравнения. . Здесь мы рассмотрим различные подходы, такие как:
- Использование if… in
- Проверка с использованием метода split()
- Использование метода find()
- Использование метода count()
- Использование метода index()
- Использование магического класса __contains__.
- Using regular expressions
Python3
|
Выход
Да! он присутствует в строке
Временная сложность: O(1)
Вспомогательный пробел: O(1)
Метод 2: Проверка подстроки с помощью метода split()Проверка наличия подстроки в заданной строке без использования какой-либо встроенной функции. Сначала разбейте данную строку на слова и сохраните их в переменной s, затем, используя условие if, проверьте, присутствует ли подстрока в данной строке или нет.
Python3
|
Output
даСпособ 3. Проверка подстроки с помощью метода find()
Мы можем итеративно проверять каждое слово, но Python предоставляет нам встроенную функцию find(), которая проверяет наличие подстроки в строке, т.е. делается в одну строку. Функция find() возвращает -1, если она не найдена, иначе она возвращает первое вхождение, поэтому с помощью этой функции эта проблема может быть решена.
Python3
. |
: 3 16999990
: 3 169919990
: 3
: 3
: 3
: 3
9008 Способ 6. Проверка подстроки с помощью магического класса «__contains__».
Строка Python __contains__(). Этот метод используется для проверки наличия строки в другой строке или нет.
Python3
|
Вывод
Да! Компьютерщики-13 содержат. Да! Выродки-78 содержат.Способ 7. Проверка подстроки с помощью регулярных выражений
RegEx можно использовать для проверки наличия в строке указанного шаблона поиска. В Python есть встроенный пакет re , который можно использовать для работы с регулярными выражениями.
Python3
|
Выход
NO, String 'Geeks' Is Not In String 'A Geeek Is Toper' A Toper 'Affee's Is Wealls' in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in string 'in in in in in in in in in in in in in in in in worpl
Метод: Использование понимания списка
Python3
|
Output
['yes']
Method: Using lambda function
Python3
|
Output
['yes']
Method: Using countof функция
Python3
|
Output
['yes']
Метод: Использование метода operator.contains()
Подход
- Используется метод operator.contains() для проверки наличия14 подстроки 900 в строке 14. Условие является истинной печатью, да, в противном случае печать №
Python3
|
Output
yes
Time Complexity : O(N)
Вспомогательный пробел: O(1)
Метод: использование срезов
В этой реализации используется цикл для перебора всех возможных начальных индексов подстроки в строке, а затем используется срез для сравнения текущей подстроки с подстрокой. аргумент.
Если текущая подстрока соответствует аргументу подстроки, функция возвращает значение True. Если после проверки всех возможных начальных индексов подстрока не найдена, то функция возвращает False.
Python3
040404040404040404 04444444904.40404040449. 404040404049.0040 |
Выход
Истинно
Временная сложность: O(n*m)
, где n — длина строкового аргумента, а m — длина подстроки. Это связано с тем, что функция использует цикл для перебора всех возможных начальных индексов подстроки в строке, а затем использует срез для сравнения текущей подстроки с аргументом подстроки. В худшем случае цикл будет повторяться n-m+1 раз, и каждая операция среза занимает O(m) времени, что приводит к общей временной сложности O((n-m+1)m) = O(nm) .
Вспомогательный пробел: O(1)
Как проверить, содержит ли строка Python подстроку — настоящий Python
лучший способ проверить, содержит ли строка другую строку в Python.
Идентификация таких подстрок пригодится, когда вы работаете с текстовым содержимым из файла или после того, как вы получили пользовательский ввод. Вы можете выполнять различные действия в своей программе в зависимости от того, присутствует подстрока или нет.
В этом руководстве вы сосредоточитесь на самом Pythonic способе решения этой задачи, используя оператор членства в
. Кроме того, вы узнаете, как идентифицировать правильные строковые методы для связанных, но разных вариантов использования.
Наконец, вы также узнаете, как найти подстроки в столбцах pandas . Это полезно, если вам нужно выполнить поиск данных из CSV-файла. Вы могли бы использовать подход, который вы узнаете в следующем разделе, но если вы работаете с табличные данные , лучше всего загрузить данные в pandas DataFrame и искать подстроки в pandas.
Как убедиться, что строка Python содержит другую строку
Если вам нужно проверить, содержит ли строка подстроку, используйте оператор принадлежности Python в
. В Python это рекомендуемый способ подтверждения наличия подстроки в строке:
>>>
>>> raw_file_content = """Привет и добро пожаловать. ... Это специальный скрытый файл с СЕКРЕТНЫМ секретом. ... Я не хочу раскрывать тебе Секрет, ... но я хочу по секрету сказать вам, что он у меня есть.""" >>> "секрет" в raw_file_content Истинный
Оператор членства в
дает вам быстрый и удобный способ проверить, присутствует ли подстрока в строке. Вы можете заметить, что строка кода читается почти как английский язык.
Примечание: Если вы хотите проверить, является ли подстрока , а не в строке, вы можете использовать не в
:
>>>
>>> "secret" не в raw_file_content ЛОЖЬ
Поскольку подстрока "секретная"
присутствует в raw_file_content
, оператор не в
возвращает False
.
При использовании в
выражение возвращает логическое значение:
-
Истинно
, если Python нашел подстроку -
Ложь
, если Python не нашел подстроку
Вы можете использовать этот интуитивно понятный синтаксис в условных операторах для принятия решений в вашем коде:
>>>
>>> если "секрет" в raw_file_content: . .. печать("Найдено!") ... Найденный!
В этом фрагменте кода вы используете оператор принадлежности, чтобы проверить, является ли "secret"
подстрокой raw_file_content
. Если это так, то вы напечатаете сообщение на терминал. Любой код с отступом будет выполняться только в том случае, если проверяемая вами строка Python содержит предоставленную вами подстроку.
Примечание: Python всегда рассматривает пустые строки как подстроку любой другой строки, поэтому проверка на наличие пустой строки в строке возвращает True
:
>>>
>>> "" в "секрет" Истинный
Это может показаться удивительным, поскольку Python считает строки emtpy ложными, но это крайний случай, о котором полезно помнить.
Оператор членства в
— ваш лучший друг, если вам просто нужно проверить, содержит ли строка Python подстроку.
Однако что, если вы хотите узнать больше о подстроке? Если вы прочитаете текст, хранящийся в raw_file_content
, то вы заметите, что подстрока встречается более одного раза и даже в разных вариациях!
Какие из этих вхождений нашел Python? Имеет ли значение заглавная буква? Как часто эта подстрока встречается в тексте? И каково расположение этих подстрок? Если вам нужен ответ на любой из этих вопросов, продолжайте читать.
Удалить рекламу
Обобщить проверку, удалив чувствительность к регистру
Строки Python чувствительны к регистру. Если подстрока, которую вы предоставляете, использует заглавные буквы, отличные от того же слова в вашем тексте, то Python не найдет ее. Например, если вы проверяете строчное слово "secret"
в заглавной версии исходного текста, проверка оператора принадлежности возвращает False
:
>>>
>>> title_cased_file_content = """Привет и добро пожаловать. ... Это специальный скрытый файл с секретным секретом. ... Я не хочу рассказывать вам секрет, ... Но я хочу по секрету сказать вам, что он у меня есть. >>> "секрет" в title_cased_file_content ЛОЖЬ
Несмотря на то, что слово секрет появляется несколько раз в тексте заголовка title_cased_file_content
, никогда не появляется во всех строчных буквах. Вот почему проверка, которую вы выполняете с оператором членства, возвращает False
. Python не может найти строчную строку «секрет»
в предоставленном тексте.
У людей другой подход к языку, чем у компьютеров. Вот почему вы часто хотите игнорировать заглавные буквы, когда проверяете, содержит ли строка подстроку в Python.
Вы можете обобщить проверку подстроки, преобразовав весь входной текст в нижний регистр:
>>>
>>> file_content = title_cased_file_content.lower() >>> печать (файл_содержимое) привет и добро пожаловать. это специальный скрытый файл с секретным секретом. я не хочу раскрывать тебе тайну, но я хочу по секрету сказать вам, что у меня есть один. >>> "секрет" в файле_содержимого Истинный
Преобразование вводимого текста в нижний регистр — распространенный способ объяснить тот факт, что люди думают о словах, различающихся только заглавными буквами, как об одном и том же слове, а компьютеры — нет.
Примечание: В следующих примерах вы продолжите работать с file_content
, версией текста в нижнем регистре.
Если вы работаете с исходной строкой ( raw_file_content
) или с заголовком ( title_cased_file_content
), вы получите разные результаты, потому что они не в нижнем регистре. Не стесняйтесь попробовать это, пока вы работаете с примерами!
Теперь, когда вы преобразовали строку в нижний регистр, чтобы избежать непреднамеренных проблем, связанных с чувствительностью к регистру, пришло время углубиться и узнать больше о подстроке.
Узнайте больше о подстроке
Оператор принадлежности к
— отличный способ описательно проверить наличие подстроки в строке, но он не дает вам никакой дополнительной информации. Он идеально подходит для условных проверок, но что, если вам нужно больше узнать о подстроках?
Python предоставляет множество дополнительных строковых методов, которые позволяют вам проверять, сколько целевых подстрок содержит строка, искать подстроки в соответствии со сложными условиями или находить индекс подстроки в вашем тексте.
В этом разделе вы познакомитесь с некоторыми дополнительными строковыми методами, которые помогут вам больше узнать о подстроке.
Примечание: Возможно, вы видели следующие методы, используемые для проверки наличия в строке подстроки. Это возможно, но они не предназначены для этого!
Программирование — это творческая деятельность, и всегда можно найти разные способы выполнения одной и той же задачи. Однако для удобочитаемости вашего кода лучше всего использовать методы в том виде, в котором они предназначены для языка, с которым вы работаете.
Используя в
, вы подтверждаете, что строка содержит подстроку. Но вы не получили никакой информации о , где находится подстрока.
Если вам нужно знать, где в вашей строке встречается подстрока, вы можете использовать .index()
для строкового объекта:
>>>
>>> file_content = """привет и добро пожаловать. ... это специальный скрытый файл с секретным секретом. ... я не хочу раскрывать тебе секрет, ... но я хочу по секрету сказать вам, что он у меня есть.""" >>> file_content.index("секрет") 59
Когда вы вызываете .index()
для строки и передаете ей подстроку в качестве аргумента, вы получаете позицию индекса первого символа первого вхождения подстроки.
Примечание: Если Python не может найти подстроку, то .index()
вызывает исключение ValueError
.
Но что, если вы хотите найти другие вхождения подстроки? Метод .index()
также принимает второй аргумент, который может определить, с какой позиции индекса начинать поиск. Таким образом, передавая определенные позиции индекса, вы можете пропустить вхождения подстроки, которую вы уже идентифицировали:
>>>
>>> file_content.index("секрет", 60) 66
Когда вы передаете начальный индекс, который находится за первым вхождением подстроки, поиск Python начинается оттуда. В этом случае вы получите другое совпадение, а не ValueError
.
Это означает, что текст содержит подстроку более одного раза. Но как часто он там?
Вы можете использовать .count()
, чтобы быстро получить ответ, используя описательный и идиоматический код Python:
>>>
>>> file_content.count("секрет") 4
Вы использовали .count()
в строчной строке и передали подстроку "secret"
в качестве аргумента. Python подсчитал, как часто подстрока появляется в строке, и вернул ответ. Текст содержит подстроку четыре раза. Но как выглядят эти подстроки?
Вы можете проверить все подстроки, разделив текст по границам слов по умолчанию и распечатав слова на своем терминале, используя для шлейфа
:
>>>
>>> для слова в file_content.split(): ... если "секретно" в слове: ... печать (слово) ... секрет секрет. секрет, тайно
В этом примере вы используете .split()
для разделения текста в пробелах на строки, которые Python упаковывает в список. Затем вы перебираете этот список и используете в
для каждой из этих строк, чтобы увидеть, содержит ли она подстроку "secret"
.
Примечание: Вместо того, чтобы печатать подстроки, вы также можете сохранить их в новом списке, например, используя понимание списка с условным выражением:
>>>
>>> [дословно в file_content.split () если "секрет" в слове] ['секретно', 'секретно.', 'секретно', 'тайно']
В этом случае вы строите список только из слов, содержащих подстроку, что существенно фильтрует текст.
Теперь, когда вы можете проверить все подстроки, которые идентифицирует Python, вы можете заметить, что Python не заботится о том, есть ли какие-либо символы после подстроки 9.0039 "секрет" или нет. Он находит слово независимо от того, следует ли за ним пробел или знак препинания. Он даже находит такие слова, как «тайно»
.
Это приятно знать, но что делать, если вы хотите установить более строгие условия для проверки подстроки?
Удалить рекламу
Найти подстроку с условиями с помощью регулярного выражения
Вы можете сопоставлять только вхождения вашей подстроки, за которыми следует знак препинания, или идентифицировать слова, которые содержат подстроку плюс другие буквы, например "тайно"
.
В таких случаях, когда требуется более сложное сопоставление строк, вы можете использовать регулярные выражения или регулярные выражения с модулем Python re
.
Например, если вы хотите найти все слова, начинающиеся с «секрет»
, но за которыми следует хотя бы одна дополнительная буква, вы можете использовать символ слова регулярного выражения ( \w
), за которым следует квантификатор плюса. ( +
):
>>>
>>> импорт >>> file_content = """привет и добро пожаловать. ... это специальный скрытый файл с секретным секретом. ... я не хочу раскрывать тебе секрет, ... но я хочу по секрету сказать вам, что он у меня есть.""" >>> re.search(r"secret\w+", file_content)
Функция re.search()
возвращает как подстроку, соответствующую условию, так и ее начальную и конечную позиции индекса, а не просто True
!
Затем вы можете получить доступ к этим атрибутам с помощью методов объекта Match
, который обозначается m
:
>>>
>>> m = re.search(r"secret\w+", file_content) >>> м.группа() 'тайно' >>> м.промежуток() (128, 136)
Эти результаты обеспечивают большую гибкость для продолжения работы с совпавшей подстрокой.
Например, вы можете искать только те подстроки, за которыми следует запятая (,
) или точка (.
):
>>>
>>> re. search(r"секрет[\.,]", file_content)
В вашем тексте есть два возможных совпадения, но вы сопоставили только первый результат, соответствующий вашему запросу. Когда вы используете re.search()
, Python снова находит только первое совпадение . Что делать, если вы хотите все упоминания "секретных"
которые соответствуют определенному условию?
Чтобы найти все совпадения, используя re
, вы можете работать с re.findall()
:
>>>
>>> re.findall(r"секрет[\.,]", file_content) ['секрет.', 'секрет']
Используя re.findall()
, вы можете найти все совпадения шаблона в вашем тексте. Python сохраняет для вас все совпадения в виде строк в списке.
Когда вы используете группу захвата, вы можете указать, какую часть совпадения вы хотите оставить в своем списке, заключив эту часть в круглые скобки:
>>>
>>> re. findall(r"(секрет)[\.,]", file_content) ['секрет', 'секрет']
Заключив секрет в круглые скобки, вы определили единую группу захвата. Функция findall()
возвращает список строк, соответствующих этой захватываемой группе, если в шаблоне имеется ровно одна захватываемая группа. Добавив скобки вокруг секрета , вы избавились от пунктуации!
Примечание: Помните, что в вашем тексте было четыре вхождения подстроки "secret"
, и, используя re
, вы отфильтровали два конкретных вхождения, которые вы сопоставили в соответствии с особыми условиями.
Использование re.findall()
с группами соответствия — это мощный способ извлечения подстрок из вашего текста. Но вы получаете только список из строк , что означает, что вы потеряли позиции индекса, к которым у вас был доступ при использовании re.search()
.
Если вы хотите сохранить эту информацию, то re
может дать вам все совпадения в итераторе:
>>>
>>> для совпадения в re. finditer(r"(secret)[\.,]", file_content): ... печать (совпадение) ...
Когда вы используете re.finditer()
и передаете шаблон поиска и текстовое содержимое в качестве аргументов, вы можете получить доступ к каждому Совпадение с объектом
, который содержит подстроку, а также ее начальную и конечную позиции индекса.
Вы можете заметить, что в этих результатах появляются знаки препинания, даже если вы все еще используете группу захвата. Это связано с тем, что строковое представление объекта Match
отображает все совпадение, а не только первую группу захвата.
Но объект Match
является мощным контейнером информации, и, как вы уже видели ранее, вы можете выбрать именно ту информацию, которая вам нужна:
>>>
>>> для совпадения в re.finditer(r"(secret)[\.,]", file_content): . .. печать (соответствие.группа (1)) ... секрет секрет
Вызвав .group()
и указав, что вам нужна первая группа захвата, вы выбрали слово секрет без знаков препинания из каждой совпадающей подстроки.
При использовании регулярных выражений вы можете более подробно изучить сопоставление подстрок. Вместо того, чтобы просто проверять, содержит ли строка другую строку, вы можете искать подстроки в соответствии со сложными условиями.
Примечание: Если вы хотите узнать больше об использовании групп захвата и составлении более сложных шаблонов регулярных выражений, вы можете глубже изучить регулярные выражения в Python.
Использование регулярных выражений с относительно
— хороший подход, если вам нужна информация о подстроках или если вам нужно продолжить работу с ними после того, как вы нашли их в тексте. Но что, если вы работаете с табличными данными? Для этого вы обратитесь к пандам.
Удалить рекламу
Найти подстроку в столбце pandas DataFrame
Если вы работаете с данными, которые поступают не из простого текстового файла или пользовательского ввода, а из файла CSV или листа Excel, вы можете использовать тот же подход, который обсуждался выше.
Однако есть лучший способ определить, какие ячейки в столбце содержат подстроку: вы будете использовать pandas ! В этом примере вы будете работать с CSV-файлом, содержащим поддельные названия компаний и слоганы. Вы можете скачать файл ниже, если хотите работать вместе:
Когда вы работаете с табличными данными в Python, обычно лучше сначала загрузить их в pandas DataFrame
:
>>>
>>> импортировать панд как pd >>> компании = pd.read_csv("companies.csv") >>> компании.форма (1000, 2) >>> компании.голова() слоган компании 0 Кувалис-Нолан произвели революцию в метриках следующего поколения 1. Дитрих-Шамплин предлагает передовые функциональные возможности 2 ориентированных на пользователя информационных посредника West Inc. 3 ООО «Венер» использует липких информационных посредников 4 Langworth Inc заново изобретает магнитные сети
В этом блоке кода вы загрузили файл CSV, содержащий тысячу строк поддельных данных компании, в кадр данных pandas и проверили первые пять строк, используя . head()
.
После того, как вы загрузили данные в DataFrame, вы можете быстро запросить весь столбец pandas для фильтрации записей, содержащих подстроку:
>>>
>>> компании[companies.slogan.str.contains("секрет")] слоган компании 7 Maggio LLC нацелена на секретные ниши 117 фирменных секретных методологий Kub and Sons 654 Секретные парадигмы синдиката Косс-Зулауф 656 Бернье-Кин тайно синтезирует внутреннюю полосу пропускания 921 Ward-Shield использует секретную электронную коммерцию 945 Williamson Group выпускает секретные экшн-предметы
Вы можете использовать .str.contains()
в столбце pandas и передать ему подстроку в качестве аргумента для фильтрации строк, содержащих подстроку.
Примечание: Оператор индексирования ( []
) и оператор атрибута ( .
) предлагают интуитивно понятные способы получения отдельного столбца или фрагмента DataFrame.
Однако, если вы работаете с производственным кодом, который связан с производительностью, панды рекомендуют использовать оптимизированные методы доступа к данным для индексации и выбора данных.
Когда вы работаете с .str.contains()
и вам нужны более сложные сценарии сопоставления, вы также можете использовать регулярные выражения! Вам просто нужно передать шаблон поиска, совместимый с регулярным выражением, в качестве аргумента подстроки:
>>>
>>> компании[companies.slogan.str.contains(r"secret\w+")] слоган компании 656 Бернье-Кин тайно синтезирует внутреннюю полосу пропускания
В этом фрагменте кода вы использовали тот же шаблон, что и ранее, для сопоставления только слов, содержащих секрет , но затем продолжите с одним или несколькими символами слова ( \w+
). Кажется, только одна из компаний в этом поддельном наборе данных тайно управляет !
Вы можете написать любой сложный шаблон регулярного выражения и передать его . str.contains()
, чтобы вырезать из столбца pandas только те строки, которые вам нужны для анализа.
Заключение
Как настойчивый охотник за сокровищами, вы нашли каждый «секрет»
, как бы хорошо он ни был спрятан! В процессе вы узнали, что лучший способ проверить, содержит ли строка подстроку в Python, — это использовать в операторе членства
.
Вы также узнали, как описательно использовать два других строковых метода , которые часто неправильно используются для проверки подстрок:
-
.count()
для подсчета вхождений подстроки в строку -
.index()
, чтобы получить позицию индекса начала подстроки
После этого вы узнали, как находить подстроки в соответствии с более сложными условиями с помощью регулярные выражения и несколько функций в модуле Python re
.
Наконец, вы также узнали, как можно использовать метод DataFrame .