Различия между версиями 8 и 9
Версия 8 от 2020-11-03 20:34:02
Размер: 4068
Редактор: FrBrGeorge
Комментарий:
Версия 9 от 2020-11-03 22:03:34
Размер: 5859
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 65: Строка 65:
 1. …  1. `<<EJCMC(148, RegexStatement, Формула)>>`
 Написать программу, которая построчно водит некоторые арифметические формулы, а выводит `True` или `False` в зависимости от их синтаксической корректности. В формулах могут встречаться 4 арифметические действия («*», «/», «+», «-»), круглые скобки (с соблюдением парности и вложенности) вокруг синтаксически верных выражений, переменные (последовательность букв, цифр и символов подчёркивания .начинающаяся не с цифры) и числовые константы (и те, и другие, возможно, с лидирующим «+» или «-»). Пробелов в формуле нет. Наличие других символов и иное несоответствие синтаксису делает формулу некорректной (выводится `False`).
  * Я решал эту задачу так: составил БНФ, по каждому элементу БНФ делал РВ, и тестил его (финальный элемент БНФ — собственно «формула»). В конце концов получился монстр, но он шустро работает.
  * Я использовал метод `.match()` (который матчит РВ ''с начала строки'' — не знаю, насколько это быстрее, чем `search("^…")`, вряд ли, конечно), а в конец РВ добавлял «`$`»

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

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

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

  • Что такое РВ?
  • Спецсимволы
    • Точка
    • Набор символов (диаразон)
      • Отрицание набора символов
    • Повторения
      • Звёздочка
      • Плюс
      • Знак вопроса
    • Фигурные скобки
    • Скобочные группы (карманы)
    • Альтернация
    • Экранирование
    • Позиционные маркеры
      • Каретка
      • Доллар
  • Дополнительные диапазоны и позиционные маркеры
  • Контекстные проверки
    • Предпросмотр, негативный предпросмотр
    • Пост-просмотр, негативный пост-просмотр
  • Флаги
    • Поиск без учета регистра
    • Глобальный поиск
    • Многостроковый поиск
  • Жадные 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. <<EJCMC(148, RegexDump, Структура РВ)>> Написать функцию redump(needle, haystack), которая выводит следующую информацию о найденном в строке haystack регулярном выражении needle, и о структуре подстановки

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

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

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

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

         1 show(r"(\w)+(@+)?(?P<nonalpha>\W+)--(\w+)", "^_^awww-----foo;_;")
      
      3: awww-----foo
      1/6: w
      3/7: ---
      4/12: foo
      nonalpha/7: ---
  2. <<EJCMC(148, RegexStatement, Формула)>> Написать программу, которая построчно водит некоторые арифметические формулы, а выводит True или False в зависимости от их синтаксической корректности. В формулах могут встречаться 4 арифметические действия («*», «/», «+», «-»), круглые скобки (с соблюдением парности и вложенности) вокруг синтаксически верных выражений, переменные (последовательность букв, цифр и символов подчёркивания .начинающаяся не с цифры) и числовые константы (и те, и другие, возможно, с лидирующим «+» или «-»). Пробелов в формуле нет. Наличие других символов и иное несоответствие синтаксису делает формулу некорректной (выводится False).

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

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