Как сделать кроме в питоне

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

Регулярные выражения чаще всего применяются для обработки текста. Например, в шаблонах поиска, в редакторах текста и современных IDE. Они также являются важной частью таких утилит командной строки Unix: sed, grep и awk.

В C, C++ и Python поддержка регулярных выражений реализована с помощью подключаемых библиотек.

Существует несколько спецификаций регулярных выражений с открытым исходным кодом. Каждая из них использует базовый синтаксис, но имеет различные расширения дополнительного функционала. Синтаксис, используемый в модуле re, основан на синтаксисе языка программирования Perl с улучшениями, свойственными для Python.

Поиск в тексте по шаблону

Наиболее часто модуль re Python используется для поиска в тексте по шаблону. Приведенный ниже пример ищет слова ‘this’ и ‘that’ в строке текста.

Метод search() принимает шаблон, а также текст для поиска, и возвращает объект Match, когда найдено соответствующая строка. Если нет, то search() возвращает значение None.

Объект Match содержит оригинал исходной строки, использованное регулярное выражение и позицию в тексте, где найдено совпадение.

Методы start() и end() содержат целочисленные индексы строки, обозначающие, где встречается подходящий под шаблон текст.

Компиляция выражений

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

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

Множественные вхождения

До этого момента все шаблоны в приведенных примерах использовали метод search() для поиска единичного вхождения строки. Функция findall() возвращает все подстроки из текста, которые совпадают с шаблоном.

Подстрока ab встречается дважды.

Метод finditer() возвращает итератор, который создает объекты Match вместо строк, возвращаемых методом findall().

Этот пример находит те же два вхождения подстроки ab, а объект Match показывает их место в оригинальной строке.

Синтаксис шаблонов

Регулярные выражения поддерживают более мощные шаблоны. Они могут повторяться, т быть привязаны к различным частям исходной строки. А также могут быть в компактной форме, которая не подразумевает перечисление искомого символа внутри шаблона. И все это благодаря метасимволам . Следующие примеры будут использовать тестовую программу, чтобы продемонстрировать вам разнообразие шаблонов.

Функция test_patterns() отображает текст, позиции символов, а также набор строк, соответствующий каждому шаблону.

Повторы

Существует пять способов задать повтор символов в шаблоне. Паттерн, за которым следует метасимвол *, повторяется ноль или более раз. При этом ноль значит, что он не обязан присутствовать в тексте.

Замените * на +, и искомый паттерн должен присутствовать в тексте хотя бы раз. Использование ? означает, что шаблон должен встречаться ноль или один раз. Для определённого количества вхождений используйте после шаблона, где m заменяется количеством вхождений.

Чтобы задать ограниченное количество вхождений, используйте , где m – это минимальное количество вхождений, а n – максимальное. Если опустить n (), то это будет означать, что шаблон должен встречаться хотя бы m раз, но без ограничений на максимальное количество.

Заметьте, насколько больше вхождений у шаблонов ab* и ab?, чем у ab+.

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

Наборы символов

Наборы символов – это группы символов, каждый из которых может соответствовать определённому месту в шаблоне. Например, шаблону [ab] соответствует a или b.

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

Диапазон a-z это строчные буквы ASCII, а диапазон A-Z — заглавные буквы ASCII.

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

Сочетание точки с метасимволом повтора может привести к длинным совпадениям, если только не используется нежадная форма поиска.

Escape-коды

Код Значение
dЦифра.
DНе цифра.
sПробел (табуляция, пробел, новая строка и т.п.).
SНе пробел.
wБуква или цифра.
WНе буква и не цифра.

Escape-коды начинаются с обратного слеша (). Но в коде Python этот символ должен быть экранирован. Использование литерала r решает эту проблему.

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

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

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

Привязка

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

Код Значение
^начало текста или строки
$конец текста или строки
Aначало текста
Zконец текста
bпустой символ в начале или конце слова
Bпустой символ не с начала и не с конца слова

В этом примере шаблоны для поиска слов в начале и в конце строки отличаются. За словом в конце строки следует знак пунктуации, заканчивающий предложение. Шаблон w+$ не подойдёт, поскольку точка не обозначает букву или цифру.

Ограничение поиска

Если известно, что поиск будет осуществляться только в части исходной строки, можно ещё больше упростить шаблон, указав модулю re ограничить диапазон поиска. Например, если искомая строка должна находиться в начале, тогда использование метода match() вместо search() привяжет поиск к началу текста без применения в выражении специального символа.

Строка is расположена не в начале текста, поэтому она не находится с помощью метода match(). Но эта последовательность появляется в тексте два раза, поэтому метод search() находит её.

Метод search()принимает необязательные параметры начальной и конечной позиций, чтобы ограничить поиск до части исходной строки.

Этот пример реализует менее эффективную форму метода iterall(). Каждый раз, когда находится совпадение, конечная позиция этого совпадения используется для следующего поиска.

Группировка в шаблонах

Добавление групп в шаблон позволяет изолировать части совпадающего текста, расширяя возможности для разбора строк. Группы определяются заключением шаблонов в круглые скобки.

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

Чтобы найти части строки, совпадающие с каждой отдельной группой в шаблоне, используйте метод groups() объекта Match.

Match.groups() возвращает последовательность строк в порядке чередования групп в шаблоне.

Если вам не нужны все части, которые соответствуют группам, можно искать совпадение только по одной группе при помощи метода group().

Группа 0 представляет собой строку, совпадающую со всем регулярным выражением. Подгруппы пронумерованы, начиная с 1 в порядке чередования в выражении.

Python расширяет базовый синтаксис группировки, добавляя именованные группы . Использование имён для обращения к группам упрощает редактирование шаблона в будущем. Чтобы задать группе имя, используйте синтаксис (P? pattern).

Используйте метод groupdict(), чтобы получить словарь, сопоставляющий имена групп с совпадающими подстроками. Именованные шаблоны также включаются в упорядоченную последовательность метода groups().

Обновлённая версия функции test_patterns(), показывающая нумерованные и именованные группы совпадений по шаблону, облегчит понимание следующих примеров.

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

В данном случае группе (a*) соответствует пустая строка, поэтому метод groups() вернет пустую строку как подходящее значение.

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

Когда в строке нет совпадений с альтернативной группой, но весь шаблон имеет совпадения, то результат работы метода groups() равен None в том месте, где должна располагаться альтернативная группа.

Определение группы с подшаблоном полезно, когда строка, совпадающая с подшаблоном, не является частью искомого. Такие группы называются незахватными . Чтобы создать незахватную группу, используйте синтаксис (?:pattern).

Сравните группы, возвращаемые для захватных и незахватных групп шаблона, которым соответствуют одинаковые результаты.

Опции поиска

Регистронезависимый поиск

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

Исходный текст из нескольких строк

Есть два флага, которые влияют на поиск в многострочном тексте. Флаг MULTILINE, управляет тем, как шаблон обрабатывает инструкции привязки текста, содержащего символы новой строки. Когда многострочный режим включён, правила привязки для ^ и $ применяются к началу и концу каждой строки в дополнение к привязке ко всему тексту.

Шаблону в этом примере соответствуют первое или последнее слово исходной строки. Ему соответствует line. в конце текста даже при том, что там нет символа новой строки.

Без этого флага каждая строка исходного текста совпадает с шаблоном по отдельности. Добавление флага приводит к тому, что под шаблон подходит весь текст.

Unicode

В Python 2 объекты str используют набор символов ASCII. Поэтому шаблон и исходный текст должны быть представлены в кодировке ASCII. Escape-коды, описанные выше, также по умолчанию определяются в терминах ASCII.

Вследствие этого шаблону w+ будет соответствовать слово “French”, но не слово “Français”, поскольку ç не является частью набора символов ASCII. Чтобы включить поиск по символам Unicode в Python 2, добавьте флаг UNICODE при компиляции шаблона.

Другие Escape-последовательности (W, b, B, d, D, s и S) также иначе обрабатываются для текста в кодировке Unicode. Поэтому обработчик регулярных выражений использует базу Unicode для поиска свойств каждого символа.

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

Многословные регулярные выражения

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

Это регулярное выражение уже сложное. В нём несколько классов символов, групп и повторов.

Преобразование шаблона в многословный формат облегчит его расширение.

Этому регулярному выражению соответствуют те же строки, но в расширенном формате его легче читать. Комментарии также помогают различать части шаблона.

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

Возможность вставлять комментарии в многословное регулярное выражение помогает в поддержке кода. Финальная версия шаблона содержит заметки по его реализации для разработчиков. А также пробелы для отделения групп друг от друга и выделения их иерархии.

Включение флагов в шаблоны

Также можно добавлять флаги в само регулярное выражение. Например, чтобы включить регистронезависимый поиск, добавьте (?i)в начало шаблона.

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

Аббревиатуры всех флагов приведены ниже:

Флаг Аббревиатура
IGNORECASEI
MULTILINEM
DOTALLS
UNICODEU
VERBOSEX

Включённые в регулярное выражение флаги можно объединять путём размещения в одной группе. Например, (?imu) включает регистронезависимый поиск по многострочному тексту в кодировке Unicode.

Поиск вперёд или назад

Иногда нужно сопоставить часть шаблона, только если для другой его части также будет найдено совпадение. Например, в регулярном выражении для разбора email-адреса обе угловые скобки были помечены как необязательные. В реальности скобки должны быть парными.

Приведенная ниже версия регулярного выражения использует утверждение положительного поиска вперёд для поиска пары. Синтаксис поиска вперёд следующий:

В этой версии регулярного выражения есть несколько важных изменений. Теперь имя получателя не является обязательным. Это означает, что одни лишь адреса не пройдут проверку. Что также уберегает от пар имя/адрес, имеющих некорректный формат.

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

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

Утверждение негативного поиска вперёд ((?!pattern)) говорит, что текст с этого места не должен соответствовать шаблону. Например, шаблон распознавания email-адреса может быть изменён, чтобы игнорировать адреса noreply, которые часто используются автоматическими системами.

Адреса, начинающиеся с noreply, не подходят под шаблон, поскольку утверждение поиска вперёд не работает.

Шаблон также может быть написан с использованием утверждения негативного поиска назад после нахождения совпадения для имени пользователя. Синтаксис: ? положительного поиска вперёд может быть использовано для поиска текста, следующего за шаблоном. Синтаксис: (? .

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

Передача значения счёта позволяет ограничить количество производимых замен.

Сделана только одна замена, поскольку count равен 1.

Метод subn() работает так же, как sub(), за исключением того, что он возвращает как изменённую строку, так и количество произведённых замен.

Поиск по шаблону нашёл два соответствия.

Разбиение строк с помощью шаблонов

str.split() – один из часто используемых методов разбиения строк для их последующего разбора. Но он поддерживает только символьные значения в качестве разделителей. А иногда необходимо регулярное выражение, если исходный текст отформатирован неодинаково. Например, многие языки разметки текста определяют разделители параграфов как два (или более) символа новой строки (n). В этом случае str.split() не может быть использован.

Стратегия определения параграфов с помощью метода findall() использовала бы шаблон вроде (.+?)n.

Этот шаблон не смог бы найти параграф в конце текста, как показано в примере: “Paragraph three.” не является частью вывода.

Расширение регулярного выражения так, чтобы он искал параграф с двумя (или более) символами новой строки, решает проблему, но усложняет шаблон. Использование re.split() вместо re.findall() справляется с проблемой разделения параграфов автоматически и позволяет ограничиться простым шаблоном.

Аргумент шаблона в методе split() более точно отражает спецификацию разметки: два (или более) символа новой строки обозначают разделение между параграфами исходного текста.

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

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

re – стандартная документация библиотеки модуля.

Regular Expression HOWTO – введение в регулярные выражения для Python-разработчиков от Эндрю Кучлинга.

Kodos – интерактивный инструмент тестирования регулярных выражений от Фила Шварца.

Википедия: регулярные выражения – введение и основные понятия, концепции и техники работы с регулярными выражениями.

locale – модуль для установки конфигурации при работе с текстом в кодировке Unicode.

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

Пожалуйста, опубликуйте свои комментарии по текущей теме статьи. За комментарии, лайки, подписки, дизлайки, отклики низкий вам поклон!

Предварительная обработка текста-одна из важнейших задач в обработке естественного языка (НЛП). Например, вы можете удалить все знаки препинания из текстовых документов, прежде чем их можно будет использовать для классификации текста. Аналогично, вы можете извлечь числа из текстовой строки. Написание ручных скриптов для таких задач предварительной обработки требует больших усилий и подвержено ошибкам. Принимая во внимание важность этих задач предварительной обработки, Регулярные выражения (aka Regex) были разработаны на разных языках, чтобы облегчить эти задачи предварительной обработки текста.

Регулярное выражение – это текстовая строка, описывающая шаблон поиска, который может быть использован для сопоставления или замены шаблонов внутри строки с минимальным количеством кода. В этом уроке мы будем реализовывать различные типы регулярных выражений на языке Python.

Для реализации регулярных выражений можно использовать пакет Python re . Импортируйте пакет Python re со следующей командой:

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

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

Для поиска шаблона в строке используется функция match и findall пакета re .

Функция соответствия

Инициализируйте переменную text текстовой строкой следующим образом:

Давайте напишем регулярное выражение, которое соответствует строке любой длины и любому символу:

Первый параметр функции match – это регулярное выражение, которое вы хотите найти. Регулярное выражение начинается с алфавита r , за которым следует шаблон, который вы хотите найти. Шаблон должен быть заключен в одинарные или двойные кавычки, как и любая другая строка.

Приведенное выше регулярное выражение будет соответствовать текстовой строке, так как мы пытаемся сопоставить строку любой длины и любого символа. Если совпадение найдено, функция match возвращает объект _sre.SRE_Match , как показано ниже:

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

В случае, если функция match не находит совпадения, возвращается объект null .

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

Теперь, если вы снова выполните следующее регулярное выражение, совпадение будет найдено:

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

Чтобы сопоставить строку длиной не менее 1, используется следующее регулярное выражение:

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

Поиск по алфавиту

Функция match может использоваться для поиска любых букв алфавита в строке. Давайте инициализируем текстовую переменную следующим текстом:

Теперь, чтобы найти все буквы алфавита, как прописные, так и строчные, мы можем использовать следующее регулярное выражение:

Это регулярное выражение утверждает, что соответствует текстовой строке для любых алфавитов от small a до small z или capital A до capital Z . Знак плюс указывает, что строка должна содержать хотя бы один символ. Выведем совпадение, найденное по приведенному выше выражению:

В выходных данных вы можете видеть, что возвращается первое слово, т. е. The . Это происходит потому, что функция match возвращает только первое найденное совпадение. В регулярном выражении мы указали, что находим шаблоны как со строчными, так и с заглавными буквами от a до z . Первое найденное совпадение было The . После слова The есть пробел, который не рассматривается как буква алфавита, поэтому сопоставление остановилось и выражение вернуло только The , которое является первым совпадением.

Однако с этим есть проблема. Если строка начинается с числа вместо алфавита, функция match вернет null, даже если после числа есть алфавиты. Давайте посмотрим на это в действии:

В приведенном выше скрипте мы обновили текстовую переменную, и теперь она начинается с цифры. Затем мы использовали функцию match для поиска алфавитов в строке. Хотя текстовая строка содержит алфавиты, null будет возвращен, так как функция match соответствует только первому элементу в строке.

Для решения этой задачи мы можем использовать функцию search .

Функция поиска

Функция search аналогична функции match , т. е. она пытается соответствовать указанному шаблону. Однако, в отличие от функции match , она соответствует шаблону глобально, а не только первому элементу. Таким образом, функция search вернет совпадение, даже если строка не содержит алфавита в начале строки, но содержит алфавит в другом месте строки, как показано ниже:

Функция search возвращает “was”, так как это первое совпадение, найденное в текстовой строке.

Совпадающая строка с самого начала

Чтобы проверить, начинается ли строка с определенного слова, вы можете использовать ключ моркови, т. е. ^ , за которым следует слово, соответствующее функции search , как показано ниже. Предположим, у нас есть следующая строка:

Если мы хотим узнать, начинается ли строка с “1998”, мы можем использовать функцию search следующим образом:

В выходных данных будет возвращен null , так как текстовая строка не содержит “1998” непосредственно в начале.

Теперь давайте изменим текстовую переменную content и добавим “1998” в начале, а затем проверим, найден ли “1998” в начале или нет. Выполните следующий сценарий:

Совпадающие строки с конца

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

В приведенном выше сценарии мы попытались найти, заканчивается ли текстовая строка на “1998”, что не так.

Теперь, если мы обновим строку и добавим “1998” в конце текстовой строки, приведенный выше скрипт вернет “Совпадение найдено”, как показано ниже:

Подстановка текста в строку

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

Возьмем простой пример функции-замены. Предположим, у нас есть следующая строка:

Чтобы заменить строку “Криминальное чтиво” на “Форрест Гамп” (еще один фильм, вышедший в 1994 году), мы можем использовать функцию sub следующим образом:

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

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

Теперь давайте заменим все алфавиты в нашей строке символом “X”. Выполните следующий сценарий:

Из выходных данных видно, что все символы были заменены, кроме заглавных. Это происходит потому, что мы указали только a-z , а не A-Z . Есть два способа решить эту проблему. Вы можете указать A-Z в регулярном выражении вместе с a-z следующим образом:

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

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

Классы сокращенных символов

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

Удаление цифр из строки

Регулярное выражение для поиска цифр в строке-это \d . Этот шаблон можно использовать для удаления цифр из строки, заменив их пустой строкой нулевой длины, как показано ниже:

Удаление букв алфавита из строки

Удаление символов Word

Если вы хотите удалить все символы слова (буквы и цифры) из строки и сохранить оставшиеся символы, вы можете использовать шаблон \w в вашем регулярном выражении и заменить его пустой строкой нулевой длины, как показано ниже:

Вывод показывает, что все цифры и алфавиты были удалены.

Удаление Несловесных символов

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

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

Группировка Нескольких Паттернов

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

Вы можете видеть, что строка в текстовой переменной имела несколько знаков препинания, мы сгруппировали все эти знаки препинания в регулярном выражении с помощью квадратных скобок. Важно отметить, что с точкой и одинарной кавычкой мы должны использовать escape-последовательность, то есть обратную косую черту. Это происходит потому, что по умолчанию оператор точки используется для любого символа, а одинарная кавычка используется для обозначения строки.

Удаление Нескольких Пробелов

Иногда несколько пробелов появляются между словами в результате удаления слов или знаков препинания. Например, в выходных данных последнего примера есть несколько пробелов между in и year . Эти пробелы могут быть удалены с помощью шаблона \s , который относится к одному пространству.

В приведенном выше сценарии мы использовали выражение \s+ , которое относится к одному или нескольким пробелам.

Удаление пробелов из начала и конца

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

Аналогично, чтобы удалить пробел в конце строки, можно использовать следующий скрипт:

Удаление одного символа

Иногда удаление знаков препинания, таких как апостроф, приводит к одному символу, который не имеет никакого значения. Например, если вы удалите апостроф из слова Jacob's и замените его пробелом, результирующая строка будет Jacob s . Здесь s не имеет смысла. Такие одиночные символы могут быть удалены с помощью регулярного выражения, как показано ниже:

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

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

Разделение строк-еще одна очень важная функция. Строки могут быть разделены с помощью функции split из этого пакета. Функция split возвращает список разделенных токенов. Давайте разделим строку слов, в которой находится один или несколько пробелов, как показано ниже:

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

Поиск Всех Экземпляров

Функция match проводит сопоставление с первым элементом, в то время как функция search проводит глобальный поиск по строке и возвращает первый сопоставленный экземпляр.

Например, если у нас есть следующая строка:

Мы хотим найти все цифры из этой строки. Если мы используем функцию search , то будет возвращено только первое вхождение цифр, т. е. 200, как показано ниже:

С другой стороны, функция findall возвращает список, содержащий все совпадающие высказывания, как показано ниже:

Из выходных данных видно, что и “200”, и “400” возвращаются функцией findall .

Вывод

В этой статье мы изучили некоторые из наиболее часто используемых функций регулярных выражений в Python. Регулярные выражения чрезвычайно полезны для предварительной обработки текста, который в дальнейшем может быть использован для различных приложений, таких как тематическое моделирование , классификация текста , сентиментальный анализ , обобщение текста и т. Д.

С поомщью str.replace мы можем менять какие-то символы на другие. Если мы просто хотим убрать какие-то символы, тогда просто заменяем их на пустую строку. str.replace() будет применять замену ко всем найденным совподениям.


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

С помощью ' re.sub '

re. sub (pattern, repl, string, count=0, flags=0)

Возвращает строку, полученную путем замены крайних левых неперекрывающихся
совпадений с шаблоном в строке на значение repl. Если совпадения с шаблоном
не найдены, возвращается неизмененная строка
— Из документации Python'а

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


  • Заменяемый шаблон → “[ $ | @ | & ]”
  • [ ] используется для определения множества
  • $ | @ | & → будет искать $ или @ или &
  • Заменяем на пустую строку
  • Если вышеуказанные символы заменяются найдены, то они заменяются на пустую строку
  1. 1. Убираем конкретные символы из строки
    1. 1. Воспользуемся ' str.replace '
    2. 2. С помощью ' re.sub '
    1. 1. С помощью 'isalpha()'
    2. 2. С помощью 'filter()'
    3. 3. С помощью 're.sub()'
    1. 1. С помощью 'isalnum()'
    2. 2. С помощью 're.sub()'
    1. 1. С помощью 're.sub()'
    1. 1. С помощью 'isdecimal()'
    2. 2. С помощью 're.sub()'
    3. 3. С помощью 'filter()'

    С помощью 'isalpha()'


    isalpha() используется для того, чтобы проверять, состоит ли строка только из букв. Возвращает True если является буквой. Мы будем проходить по каждому символу строки и проверять является ли он буквой.

    Пример

    (c for c in s if c.isalpha())

    Перед нами объект генератор, содержащий все буквы из строки:
    s1=””.join(c for c in s if c.isalpha())

    ””.join будет соединять все символы в одну строку.

    С помощью 'filter()'

    f = filter(str.isalpha, s)

    Функция filter() будет применять str.isalpha метод для каждого элемента строки, и если получаем истину , то мы возвращаем элемент. В противном случае - пропускаем.

    Функция filter() вернет итератор, содержащий все буквы переданной строки, а join() будем "склеиват" все элементы друг с другом.

    С помощью 're.sub()'


    Рассмотрим s1 = re.sub(“[^A-Za-z]”, ””, s)

    • “[ A-Za-z]”* → Ищет все символы, кроме букв. Если в начале множества указать * , тогда к шаблону будут подходить все те символы, которые НЕ указаны в множестве. (для русских слов используйте [^А-Яа-я] - прим. ред.)
    • Все символы, удовлетворяющие шаблону будут заменены на пустую строку.
    • Все символы, кроме букв, будут убраны.

    С помощью 'isalnum()'


    isalnum() используется, когда мы хотим определить состоит строка только из чисел или букв.

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

    С помощью 're.sub()'

    • “[^A-Za-z0–9]” → Этот шаблон будет искать все символы, кроме букв и цифр.
    • Все найденные символы будут заменены на пустую строку
    • Все символы, кроме букв и цифры убраны.

    С помощью 're.sub()'


    • 5 - цифры от 0 до 9
    • re.sub(“[0–9]”, ””, s) - если есть совпадения, заменяем на пустую строку

    С помощью 'isdecimal()'

    isdecimal() возвращает истину, если все символы строки являются цифрами, в противном случае возвращается ложь.


    Пороходим по каждому символу строки и проверяем и является ли он цифрой. "".join() соединяет все элементы.

    С помощью 're.sub()'

    Рассмотрим s1 = re.sub(“[^0–9]”, ””, s)

    • [^0-9] будет искать все символы кроме от 0 до 9
    • re.sub(“[^0–9]”, ””, s) все символы кроме цифр будут заменены на пустую строку.

    С помощью 'filter()'

    Рассмотрим f = filter(str.isdecimal, s)

    Функция filter() будет выполнять str.isdecimal метод для каждого символа, если он возвращает истину, то добовляет его в генератор. Затем генератор распаковывается в готовую строку с помощью метода join() .

    Строки в Python являются неизменяемыми объектами, поэтому все вышеуказаные методы убирает символы из данной строки и возвращает новую, они не меняют состояние оригинальной строки.

    Рекомендуем хостинг TIMEWEB

    Рекомендуем хостинг TIMEWEB

    Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.


    От редакции

    • Урок 1: Пе­ремен­ные, типы дан­ных, усло­вия и цик­лы
    • Урок 2: Стро­ки, фай­лы, исклю­чения и работа с интерне­том

    Пер­вые два уро­ка дос­тупны целиком без плат­ной под­писки. Этот — поч­ти целиком: за исклю­чени­ем пос­ледне­го при­мера и домаш­него задания.

    Работаем с файлами

    Нач­нем, как всег­да, с нес­ложных вещей. В Python есть модуль с лаконич­ным наз­вани­ем os , который (ты не поверишь!) пред­назна­чен для вза­имо­дей­ствия прог­раммы с опе­раци­онной сис­темой, в том чис­ле для управле­ния фай­лами.

    Пер­вым делом, конеч­но, нуж­но импорти­ровать его в начале нашего скрип­та:

    И теперь нам откры­вают­ся раз­ные инте­рес­ные воз­можнос­ти. К при­меру, мы можем получить путь к текущей пап­ке. Сна­чала она сов­пада­ет с той, в которой ты был при запус­ке скрип­та (даже если сам скрипт находит­ся где‑то в дру­гом мес­те), но по ходу исполне­ния прог­раммы мы можем менять это зна­чение при помощи фун­кции os. chdir( ) .

    Ес­ли ты работа­ешь в Windows, то в пути к фай­лу или пап­ке перед откры­вающей кавыч­кой ука­зывай бук­ву r (что озна­чает raw) или вмес­то одной косой чер­ты в пути ставь две.

    Поп­робу­ем получить спи­сок фай­лов с рас­ширени­ем .py, находя­щих­ся в текущей дирек­тории. Для это­го исполь­зуем модули os и fnmatch.

    Мо­дуль fnmatch поз­воля­ет искать в стро­ках опре­делен­ный текст, под­ходящий по мас­ке к задан­ному шаб­лону:

    • * заменя­ет любое количес­тво любых сим­волов;
    • ? заменя­ет один любой сим­вол;
    • [ seq] заменя­ет любые сим­волы из пос­ледова­тель­нос­ти в квад­ратных скоб­ках;
    • [! seq] заменя­ет любые сим­волы, кро­ме тех, что при­сутс­тву­ют в квад­ратных скоб­ках.

    Да­вай без­жалос­тно уда­лим какой‑нибудь файл:

    А теперь соз­дадим пап­ку по ука­зан­ному пути и сра­зу же уда­лим ее. Для это­го при­годит­ся модуль shutil, где есть фун­кция rmtree( ) , которая уда­ляет пап­ку вмес­те с содер­жимым.

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

    warning

    Будь осто­рожен — скрипт в таком виде обша­рит весь диск D. Если он у тебя есть и там мно­го хла­ма, то про­цесс может затянуть­ся.

    Фун­кция walk() модуля os при­нима­ет один обя­затель­ный аргу­мент — имя катало­га. Она пос­ледова­тель­но про­ходит все вло­жен­ные катало­ги и воз­вра­щает объ­ект‑генера­тор, из которо­го получа­ют:

    • ад­рес оче­ред­ного катало­га в виде стро­ки;
    • спи­сок имен под­катало­гов пер­вого уров­ня вло­жен­ности для дан­ного катало­га;
    • спи­сок имен фай­лов дан­ного катало­га.

    Ге­нера­тор — это объ­ект, который сра­зу при соз­дании не вычис­ляет зна­чения всех сво­их эле­мен­тов. Этим генера­торы отли­чают­ся от спис­ков — те хра­нят в памяти все свои эле­мен­ты, и уда­лить их мож­но толь­ко прог­рам­мно. Вычис­ления с помощью генера­торов называ­ются ленивы­ми, они эко­номят память. Под­робнее мы рас­смот­рим генера­торы в сле­дующих уро­ках.

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

    Да­вай пошутим над юзе­ром: соз­дадим какой‑нибудь файл и будем пос­тоян­но его откры­вать с помощью той прог­раммы, которой этот файл обыч­но откры­вает­ся в сис­теме:

    Ни­же при­веден спи­сок еще некото­рых полез­ных команд:

    • os. path. basename( 'путь') — воз­вра­щает наз­вание фай­ла или пап­ки в кон­це пути;
    • os. path. dirname( 'путь') — воз­вра­щает родитель­ский путь к объ­екту пути;
    • os. path. splitext( 'путь') — раз­деля­ет путь на путь и рас­ширение фай­ла;
    • os. path. exists( 'путь') — сущес­тву­ет ли путь до фай­ла или пап­ки;
    • os. path. isfile( 'путь') — явля­ется ли объ­ект пути фай­лом (сущес­тву­ющим);
    • os. path. isdir( 'путь') — явля­ется ли объ­ект пути пап­кой (сущес­тву­ющей).

    Регулярные выражения

    Ре­гуляр­ные выраже­ния — это спе­циаль­ные шаб­лоны для поис­ка и замены строк в тек­сте. Вооб­ще говоря, их впол­не мож­но счи­тать самос­тоятель­ным язы­ком, и его изу­чение выходит за рам­ки это­го цик­ла. Мы прой­дем­ся по самым осно­вам и по исполь­зованию регуля­рок в Python.

    За работу с регуляр­ными выраже­ниями в Python отве­чает модуль re. Пер­вым делом импорти­руем его.

    string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

    Что­бы вер­нуть все вхож­дения шаб­лона в текст, исполь­зует­ся коман­да re. findall( pattern, string) . Эта коман­да вер­нет спи­сок строк, которые при­сутс­тву­ют в тек­сте и сов­пада­ют с шаб­лоном.

    string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

    В пре­дыду­щих двух при­мерах прог­рамм в качес­тве шаб­лона pattern для поис­ка строк ты исполь­зовал прос­то какое‑то сло­во. Но мощь регуляр­ных выраже­ний не в этом. Ты можешь заменять час­ти шаб­лона спе­циаль­ными сим­волами, что­бы под шаб­лон под­ходили не толь­ко кон­крет­ные сло­ва, но и самые раз­ные стро­ки.

    string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "

    Краткая справка по специальным символам

    Крат­кая справ­ка по спе­циаль­ным сим­волам

    Да­вай поп­робу­ем выпол­нить чуть более слож­ную задачу. Най­дем в тек­сте все email с доменом mail. ru , если они там есть.

    string = "Если вы хотите связаться с админом, пишите на почту admin@mail. ru. По другим вопросам обращайтесь на support@mail. ru. "

    Час­то быва­ет нуж­но най­ти какой‑то эле­мент стро­ки, окру­жен­ный дву­мя дру­гими эле­мен­тами. Нап­ример, это может быть URL. Что­бы выделить ту часть шаб­лона, которую нуж­но вер­нуть, исполь­зуют­ся скоб­ки. При­веду при­мер, в котором ты получишь все адре­са ссы­лок из какого‑то кусоч­ка кода на HTML.

    string = 'Вы можете посмотреть карту сайта a href s">php"> тут a>. Посетите также a href s">php"раздел a> '

    В коде выше исполь­зовал­ся пат­терн r'href — в этом шаб­лоне иско­мая стро­ка начина­ется с href code47">result . Точ­ка и плюс внут­ри ско­бок ука­зыва­ют, что внут­ри кавычек могут быть любые сим­волы (кро­ме сим­вола новой стро­ки). Знак воп­роса озна­чает, что нуж­но оста­новить­ся перед пер­вой же встре­чен­ной кавыч­кой.

    Мы можем не толь­ко искать стро­ки, но и заменять их чем‑то дру­гим. Нап­ример, давай поп­робу­ем уда­лить из HTML-кода все теги. Для это­го исполь­зует­ся коман­да re. sub( pattern, 'чем заменять', string) .

    string = 'Вы можете посмотреть карту сайта a href s">php"> тут a>. Посетите также a href s">php"раздел a> '

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

    Ре­гуляр­ные выраже­ния — очень мощ­ная шту­ка. Осво­ив их, ты смо­жешь делать со стро­ками поч­ти все, что угод­но, а в сочета­нии с кодом на Python — бук­валь­но что угод­но. Для начала же можешь поэк­спе­римен­тировать и изме­нить какие‑то из при­веден­ных рецеп­тов.

    Функции

    Приш­ла пора под­робнее погово­рить о фун­кци­ях. Мы уже неод­нократ­но вызыва­ли раз­ные фун­кции — как встро­енные в Python (нап­ример, print( ) ), так и из под­клю­чаемых модулей (нап­ример, urllib. request( ) ). Но что такое фун­кция изнутри и как их делать самос­тоятель­но?

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

    В объ­ектно ори­енти­рован­ном прог­рамми­рова­нии фун­кции явля­ются метода­ми какого‑либо клас­са и пишут­ся через точ­ку от его наз­вания.

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

    Объ­явле­ние фун­кции начина­ется с клю­чево­го сло­ва def , далее сле­дует имя фун­кции, парамет­ры в скоб­ках и прог­рам­мный код, отде­лен­ный четырь­мя про­бела­ми. Фун­кция может воз­вра­щать одно или нес­коль­ко зна­чений с помощью клю­чево­го сло­ва return . Оно, кста­ти, прек­раща­ет работу фун­кции, и, если за ним идут какие‑то коман­ды, они будут про­пуще­ны.

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

    Те­перь, ког­да ты опи­сал фун­кцию, далее в этой же прог­рамме мож­но ее вызывать.

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

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

    Нес­мотря на то что параметр b в дан­ном слу­чае равен по умол­чанию 10 и необя­зате­лен для переда­чи в качес­тве вто­рого аргу­мен­та, ты по‑преж­нему можешь переда­вать вто­рой аргу­мент, если это будет нуж­но, и тог­да в качес­тве b будет исполь­зовано не 10 , а передан­ное зна­чение.

    Внут­ри прог­раммы мы можем вызывать соз­данную нами фун­кцию сколь­ко угод­но раз.

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

    Читайте также: