Как найти совпадения в Word
Обновлено: 21.11.2024
Регулярные выражения — это мощный язык для сопоставления текстовых шаблонов. На этой странице дается базовое введение в сами регулярные выражения, достаточное для наших упражнений по Python, и показано, как регулярные выражения работают в Python. Модуль Python "re" обеспечивает поддержку регулярных выражений.
В Python поиск по регулярному выражению обычно записывается так:
Метод re.search() принимает шаблон регулярного выражения и строку и ищет этот шаблон в строке. Если поиск успешен, search() возвращает объект соответствия или None в противном случае. Поэтому за поиском обычно сразу же следует оператор if для проверки успешности поиска, как показано в следующем примере, который ищет шаблон «слово:», за которым следует трехбуквенное слово (подробности ниже):
Код match = re.search(pat, str) сохраняет результат поиска в переменной с именем "match". Затем оператор if проверяет совпадение — если оно истинно, поиск успешен, и match.group() является совпадающим текстом (например, 'word:cat'). В противном случае, если совпадение ложно (точнее, нет), то поиск не увенчался успехом и соответствующего текста нет.
"r" в начале строки шаблона обозначает необработанную строку Python, которая проходит через обратную косую черту без изменений, что очень удобно для регулярных выражений (Java очень нуждается в этой функции!). Я рекомендую вам всегда писать шаблонные строки с буквой 'r' просто по привычке.
Основные шаблоны
Преимущество регулярных выражений заключается в том, что они могут задавать шаблоны, а не только фиксированные символы. Вот самые основные шаблоны, которые соответствуют одиночным символам:
- a, X, 9, match = re.search(pat, str) выполнено успешно, match не равно None и, в частности, match.group() является совпадающим текстом
Повторение
Все становится еще интереснее, когда вы используете + и * для указания повторения в шаблоне
- + -- 1 или более вхождений шаблона слева от него, например. 'i+' = один или несколько i
- * -- 0 или более вхождений шаблона слева от него <ли>? -- соответствует 0 или 1 вхождению шаблона слева от него
Самый левый и самый большой
Сначала поиск находит самое левое совпадение с шаблоном, а затем он пытается использовать как можно большую часть строки, т. е. + и * идут как можно дальше (+ и * называются "жадными"). ").
Примеры повторения
Пример электронного письма
В этом случае при поиске не будет получен весь адрес электронной почты, потому что \w не соответствует '-' или '.' в адрес. Мы исправим это, используя описанные ниже функции регулярных выражений.
Квадратные скобки
Квадратные скобки можно использовать для обозначения набора символов, поэтому [abc] соответствует 'a', 'b' или 'c'. Коды \w, \s и т. д. также работают внутри квадратных скобок, за одним исключением: точка (.) просто означает буквальную точку. Для проблемы с электронной почтой квадратные скобки — это простой способ добавить '.' и '-' для набора символов, которые могут появляться вокруг @ с шаблоном r'[\w.-]+@[\w.-]+', чтобы получить весь адрес электронной почты:
(Дополнительные функции квадратных скобок) Вы также можете использовать тире для обозначения диапазона, поэтому [a-z] соответствует всем строчным буквам. Чтобы использовать дефис без указания диапазона, поставьте дефис последним, например. [абв-]. Шляпа вверх (^) в начале набора квадратных скобок инвертирует его, поэтому [^ab] означает любой символ, кроме 'a' или 'b'.
Извлечение группы
Свойство регулярного выражения "группировать" позволяет выделить части совпадающего текста. Предположим, для проблемы с электронной почтой мы хотим извлечь имя пользователя и хост отдельно. Для этого добавьте скобки ( ) вокруг имени пользователя и хоста в шаблоне, например: r'([\w.-]+)@([\w.-]+)'. В этом случае круглые скобки не меняют того, чему будет соответствовать шаблон, вместо этого они устанавливают логические «группы» внутри текста совпадения. При успешном поиске match.group(1) — это текст совпадения, соответствующий первой левой скобке, а match.group(2) — текст, соответствующий второй левой скобке. Обычный match.group() по-прежнему содержит весь текст совпадения, как обычно.
Обычный рабочий процесс с регулярными выражениями заключается в том, что вы пишете шаблон для того, что ищете, добавляя группы скобок для извлечения нужных частей.
найти
findall(), вероятно, самая мощная функция в модуле re. Выше мы использовали re.search(), чтобы найти первое совпадение с шаблоном. findall() находит *все* совпадения и возвращает их в виде списка строк, где каждая строка представляет одно совпадение.
найти все с файлами
Для файлов у вас может быть привычка писать цикл для перебора строк файла, а затем вы можете вызывать findall() для каждой строки. Вместо этого позвольте findall() сделать итерацию за вас — гораздо лучше! Просто передайте весь текст файла в findall() и позвольте ему вернуть список всех совпадений за один шаг (напомним, что f.read() возвращает весь текст файла в одной строке):
найти все и группы
Рабочий процесс RE и отладка
Шаблоны регулярных выражений содержат много смысла всего в нескольких символах , но они настолько плотны, что вы можете потратить много времени на отладку своих шаблонов. Настройте среду выполнения так, чтобы вы могли запускать шаблон и легко печатать то, что ему соответствует, например, запустив его на небольшом тестовом тексте и распечатав результат findall(). Если шаблон ничему не соответствует, попробуйте ослабить шаблон, удалив его части, чтобы получить слишком много совпадений. Когда он ничему не соответствует, вы не можете добиться никакого прогресса, поскольку нет ничего конкретного, на что можно было бы смотреть. Когда совпадений становится слишком много, вы можете постепенно ужесточать их, чтобы получить именно то, что вам нужно.
Параметры
Функции re принимают параметры для изменения поведения сопоставления с образцом. Флаг опции добавляется в качестве дополнительного аргумента к search() или findall() и т. д., например. re.search(pat, str, re.IGNORECASE).
- IGNORECASE – игнорирует различия в верхнем и нижнем регистре при сопоставлении, поэтому "a" соответствует как "a", так и "A".
- DOTALL -- позволяет точке (.) соответствовать новой строке -- обычно она соответствует чему угодно, кроме новой строки. Это может сбить вас с толку — вы думаете, что .* соответствует всему, но по умолчанию он не выходит за конец строки. Обратите внимание, что \s (пробел) включает символы новой строки, поэтому, если вы хотите сопоставить набор пробелов, который может включать новую строку, вы можете просто использовать \s*
- MULTILINE -- В строке, состоящей из многих строк, разрешается использовать символы ^ и $ для соответствия началу и концу каждой строки. Обычно ^/$ соответствует только началу и концу всей строки.
Жадные и нежадные (необязательно)
Это необязательный раздел, в котором показана более сложная техника регулярных выражений, которая не требуется для упражнений.
Предположим, у вас есть текст с тегами: foo и так далее
Предположим, вы пытаетесь сопоставить каждый тег с шаблоном '()' — чему он соответствует в первую очередь?
Результат немного удивителен, но жадный аспект .* заставляет его сопоставлять все "foo и так далее" как одно большое совпадение. Проблема в том, что .* идет настолько далеко, насколько это возможно, вместо того, чтобы останавливаться на первом > (он же "жадный").
Есть расширение для регулярного выражения, где вы добавляете ? в конце, например .*? или .+?, изменив их на нежадные. Теперь они останавливаются, как только могут. Таким образом, шаблон '( )' будет просто '' как первое совпадение и '' как второе совпадение, и так далее, получая каждую пару по очереди. Стиль обычно таков, что вы используете .*?, а затем сразу же ищете какой-то конкретный маркер (> в данном случае), который заставляет конец .*? беги.
*? расширение возникло в Perl, а регулярные выражения, включающие расширения Perl, известны как Perl-совместимые регулярные выражения — pcre. Python включает поддержку pcre. Многие утилиты командной строки и т. д. имеют флаг, указывающий, что они принимают шаблоны pcre.
Старый, но широко используемый метод для кодирования этой идеи "все эти символы, кроме остановки на X" использует стиль квадратных скобок. Для приведенного выше вы можете написать шаблон, но вместо .*, чтобы получить все символы, используйте [^>]*, который пропускает все символы, которые не > (начальный ^ «инвертирует» набор квадратных скобок, поэтому он соответствует любой символ, не указанный в скобках).
Замена (необязательно)
Функция re.sub(pat, replace, str) ищет все экземпляры шаблона в заданной строке и заменяет их. Строка замены может включать '\1', '\2', которые относятся к тексту из группы (1), группы (2) и т. д. из исходного соответствующего текста.
Упражнение
Чтобы попрактиковаться в использовании регулярных выражений, см. упражнение "Имена для детей".
Если не указано иное, содержимое этой страницы предоставляется по лицензии Creative Commons Attribution 4.0, а образцы кода — по лицензии Apache 2.0. Подробнее см. в Правилах сайта Google Developers. Java является зарегистрированным товарным знаком Oracle и/или ее дочерних компаний.
Часто надстройкам необходимо действовать на основе текста документа. Функция поиска предоставляется каждым элементом управления содержимым (включая Body, Paragraph, Range, Table, TableRow и базовый объект ContentControl). Эта функция принимает строку (или выражение с подстановочными знаками), представляющую текст, который вы ищете, и объект SearchOptions. Он возвращает набор диапазонов, соответствующих искомому тексту.
Параметры поиска
Параметры поиска представляют собой набор логических значений, определяющих, как должен обрабатываться параметр поиска.
Свойство | Описание |
---|---|
ignorePunct | Получает или задает значение, указывающее, следует ли игнорировать все знаки препинания между словами. Соответствует флажку «Игнорировать знаки препинания» в диалоговом окне «Найти и заменить». |
ignoreSpace | Получает или задает значение, указывающее, следует ли игнорировать все пробелы между словами. Соответствует флажку «Игнорировать символы пробела» в диалоговом окне «Найти и заменить». |
matchCase | < td style="text-align: left;"> Получает или задает значение, указывающее, следует ли выполнять поиск с учетом регистра. Соответствует флажку «Учитывать регистр» в диалоговом окне «Найти и заменить».|
matchPrefix | Получает или задает значение, указывающее, следует ли сопоставлять слова, начинающиеся со строки поиска. Соответствует флажку «Сопоставить префикс» в диалоговом окне «Найти и заменить». |
matchSuffix | Получает или задает значение, указывающее, следует ли сопоставлять слова, оканчивающиеся на строку поиска. Соответствует флажку «Сопоставить суффикс» в диалоговом окне «Найти и заменить». |
matchWholeWord | Получает или задает значение, указывающее, следует ли искать операцию только целых слов, а не текста, который является частью большего слова. Соответствует флажку «Найти только слова целиком» в диалоговом окне «Найти и заменить». |
matchWildcards | Получает или задает значение, указывающее, будет ли поиск выполняться с использованием специальных операторов поиска. Соответствует флажку «Использовать подстановочные знаки» в диалоговом окне «Найти и заменить». |
Подстановочные знаки
В следующей таблице приведены рекомендации по подстановочным знакам поиска в Word JavaScript API.
Чтобы найти: | Подстановочный знак | Образец |
---|---|---|
Любой одиночный символ | < td style="text-align: left;">?s?t находит sat и set. | |
* | s*d считает грустным и запущенным. | |
Начало слова | (in)> находит внутри и внутри, но не интересно. | |
Один из указанных символов | [ ] | w[io]n находит выигрыш и выигрывает. |
Любой одиночный символ в этом диапазоне | [-] | [rt]ight находит правое и прицельное . Диапазоны должны быть в порядке возрастания. |
Любой одиночный символ, кроме символов в диапазоне, заключенном в скобки | [!xz] | t[!am]ck находит так и складки, но не складки или галочки. td> |
Ровно n вхождений предыдущего символа или выражения | fed находит фид, но не кормит. | |
Не менее n вхождений предыдущего символа или выражение | feed находит Feed и Feed. | |
10 находит 10, 100 и 1000. | ||
Одно или несколько вхождений предыдущего символа или выражения | < td style="text-align: left;">@lo@t находит много и добычу. |