Различия между версиями 14 и 15
Версия 14 от 2020-11-04 09:37:22
Размер: 8627
Редактор: FrBrGeorge
Комментарий:
Версия 15 от 2020-11-04 09:39:58
Размер: 6995
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 48: Строка 48:
 1. `<<EJCMC(148, RegexDump, Структура РВ)>>`
 Написать функцию `redump(needle, haystack)`, которая выводит следующую информацию о найденном в строке `haystack` регулярном выражении `needle`, и о структуре подстановки
   * Если подстрока не найдена, выводится пустая строка
   * Если подстрока найдена, выводится `позиция: подстрока`, где «позиция» — это номер символа в строке, начиная с которого была найдена подстрока
   * Если в регулярном выражении присутствовала группировка с сохранением (попросту скобочки), выводится `номер группы/позиция: подстрока` для каждой группы
   * Если в регулярном выражении присутствовали именованные группы, выводится `имя группы/позиция: подстрока` для каждой группы
   * Если какая-то группа присутствует в исходном выражении, но не нашла сопоставления (например, была помечена повторителем `*` и пропущена), она не выводится
   {{{#!highlight python
show(r"(\w)+(@+)?(?P<nonalpha>\W+)--(\w+)", "^_^awww-----foo;_;")
   }}}
   {{{
3: awww-----foo
1/6: w
3/7: ---
4/12: foo
nonalpha/7: ---
   }}}
 1. <<EJCMC(148, RegexDump, Структура РВ)>>

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

  • неплохая методичка, в которой есть практически всё про РВ, о чём говорилось в лекции. Серьёзно, прямо план лекции.

Перевод этого плана с русского на русский:) :

  • Что такое РВ?
  • Спецсимволы
    • Точка
    • Набор символов (диапазон)
      • Отрицание набора символов
    • Повторения
      • Звёздочка
      • Плюс
      • Знак вопроса
    • Фигурные скобки
    • Скобочные группы (карманы)
    • Альтернация
    • Экранирование
    • Позиционные маркеры
      • Каретка
      • Доллар
  • Дополнительные диапазоны и позиционные маркеры
  • Контекстные проверки
    • Предпросмотр, негативный предпросмотр
    • Пост-просмотр, негативный пост-просмотр
  • Флаги
    • Поиск без учета регистра
    • Многостроковый поиск
      • Перевод строки как любой символ

  • Жадные vs ленивые повторители

Поиск с заменой

В методичке нет про поиск с заменой sub()

  • Самоцитаты (back references) — \номер скобочной группы (номер открывающей скобки в целом RE)

    • Пример: (\w+).*(\1) на текст Matches between zero and unlimited times, as match times

  • Использование цитат в sub():

    • sub(r"(\w+).(\w+)", r"\2 — \1 — \1", "---qwerty---")

Ещё почитать

Д/З

  1. Прочитать и прощёлкать

TODO

  1. EJudge: RegexDump 'Структура РВ'

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

    • Если подстрока не найдена, выводится «<NONE>»

    • Если подстрока найдена, выводится позиция: подстрока, где «позиция» — это номер символа в строке, начиная с которого была найдена подстрока

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

    • Если в регулярном выражении присутствовали именованные группы, выводится имя группы/позиция: подстрока для каждой группы

    • Если какая-то группа присутствует в исходном выражении, но не нашла сопоставления (например, была помечена повторителем * и пропущена), она не выводится

    Input:

    (\w)+(@+)?(?P<nonalpha>\W+)--(\w+)
    ^_^awww-----foo;_;
    #$qwer@@@--wqer#$
    Output:

    3: awww-----foo
    1/6: w
    3/7: ---
    4/12: foo
    nonalpha/7: ---
    2: qwer@@@--wqer
    1/5: r
    2/6: @@
    3/8: @
    4/11: wqer
    nonalpha/8: @
  2. <<EJCMC(148, RegexStatement, Формула)>> Написать программу, которая построчно водит некоторые арифметические формулы, а выводит True или False в зависимости от их синтаксической корректности. В формулах могут встречаться 4 арифметические действия («*», «/», «+», «-»), круглые скобки (с соблюдением парности и вложенности) вокруг синтаксически верных выражений, переменные (последовательность букв, цифр и символов подчёркивания .начинающаяся не с цифры) и числовые константы (и те, и другие, возможно, с лидирующим «+» или «-»). Пробелов в формуле нет. Наличие других символов и иное несоответствие синтаксису делает формулу некорректной (выводится False). Лишние скобки вида (((10050))) не допускаются.

    • Я решал эту задачу так: составил нерекурсивную БНФ; по каждому элементу БНФ делал РВ, и тестил его; финальный элемент БНФ (стартовый нетерминал) — собственно «формула». В конце концов получился монстр, но он шустро работает.

    • Не забываем про скобки (особенно когда присутствует «|», а его при таком методе навалом)

    • Я использовал метод .match() (который матчит РВ с начала строки — не знаю, насколько это быстрее, чем search("^…"), вряд ли, конечно), а в конец РВ добавлял «$»

  3. <<EJCMC(148, PigLatin, Поросячья латынь)>> Согласно правилам «поросячьей латыни» английские слова при разговоре преобразуются так:

    • Если слово начинается на согласную — эта согласная переносится в конец слова, после чего добавляется «ay»: "latin" ⇒ "atinlay"

    • Если слово начинается на несколько согласных, они все переносятся в конец слова, после чего добавляется «ay»: "stupid" ⇒ "upidstay"

    • Если слово начинается на гласную, и имеет более одного слога, лидирующая гласная и все согласные за ней переносятся в конец с добавлением «ay»: "under" ⇒ "erunday" (в Википедии это второй вариант)

      • для нашего удобства непроизносимые гласные тоже считаются слогом, например "are" ⇒ "earay"; (так исторически не было: язык всё-таки разговорный)

    • Односложные слова, начинающиеся на гласную, просто дополняются «yay»: "egg" ⇒ "eggyay"

    Написать программу, которая вводит «английский» текст (текст, содержащий последовательности латинских букв и другие символы) и выводит перевод на поросячью латынь (для простоты любая последовательность английских букв с гласными считается словом). Обратите внимание на то, что слово, написанное со прописной буквы, в поросячьей латыни также пишется со прописной буквы.

    • This is an example of Hog Latin. As you can see, it’s silly, but lots of fun for children.
      Isthay isyay anyay ampleexay ofyay Oghay Atinlay. Asyay ouyay ancay eesay, ityay’s illysay, utbay otslay ofyay unfay orfay ildrenchay.

LecturesCMC/PythonIntro2020/09_RegularExpressions (последним исправлял пользователь ArsenyMaslennikov 2020-11-07 16:47:57)