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

Немного истории

Копия плана (примеры и пояснения см. на сайте):

Сверх плана, 3.11+:

Особенности Python

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

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

Ещё почитать

Д/З

  1. Прочитать и прощёлкать
  2. EJudge: RegexDump 'Структура РВ'

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

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

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

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

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

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

    Input:

    (\w)+(@+)?(?P<nonalpha>\W+)--(\w+)
    ^_^awww-----foo;_;
    L'amor che muove il sole e l'altre stelle
    #$qwer@@@--wqer#$
    Output:

    3: awww-----foo
    1/6: w
    3/7: ---
    4/12: foo
    nonalpha/7: ---
    <NONE>
    2: qwer@@@--wqer
    1/5: r
    2/6: @@
    3/8: @
    4/11: wqer
    nonalpha/8: @
  3. EJudge: BraceDecode 'Интервалы'

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

    • В начале и конце строки стоит по одной круглой или квадратной скобке
    • В скобках указаны два числа, разделённые описателем интервала
    • Число — либо целое, либо вещественное с фиксированной точкой и обязательными целой и дробной частями

      • вокруг числа (и для простоты — после необязательного минуса тоже) могут стоять пробелы
    • Описатель интервала — либо (1) две и более точки, либо (2) конструкция вида «..длина..», где длина — это целое число ⩾2

    interval(diap) должна возвращать последовательность чисел типа Fraction от левого числа до правого.

    • Длина этой последовательности — это либо количество точек в варианте (1), либо значение длины в варианте (2)

    • Круглая скобка вместо квадратной исключает из последовательности соответствующий элемент (начало или конец) и делает её на один элемент короче.
    • Все элементы последовательности должны быть равноудалены друг от друга.
    • Если diap не соответствует формату, последовательность пустая.

    Input:

       1 print(*interval("[1.....10.5)"))
    
    Output:

    1 27/8 23/4 65/8
  4. EJudge: CorrectNumber 'Проверка числа'

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

    • Число в обычной форме не должно содержать ведущих нулей. Знак "-" должен стоять только перед непололожительным числом и только в одном экземпляре. Число также может быть записано в двоичной, восьмеричной или шестнадцатеричной системе счисления. В различных системах счисления число будет иметь вид (угловые скобки означают термин):
      %0x<обычная форма>
      в шестнадцатеричной (состоит из цифр и маленьких латинских букв). Число знаков после "0x" не должно превышать 16.
      %0o<обычная форма>
      в восьмеричной. Число знаков после "0o" не должно превышать 8.
      %0b<обычная форма>
      в двоичной. Число знаков после "0b" не должно превышать 20.
    • Знак "-" также может быть только один и должен стоять перед символом "%". Примеры корректных чисел в обычной форме: 75, -%0x6f4, %0b101110 , %0o1705.

    • Число в экспоненциальной форме представляет собой запись следующего вида (необязательные элементы заключены в квадратные скобки):
          <число в обычной форме>[<.><неотрицательное число в обычной форме, может содержать ведущие нули, не влияющие на подсчет количества знаков и стоящие до символа "%" если число не в десятичной системе счисления>]<E>[<знак "+" или "-"><неотрицательное число в обычной форме>]

    В зависимости от корректности вывести "YES" или "NO"

    Input:

    %0x5f7.00%0b1011E-%0o71
    Output:

    YES

LecturesCMC/PythonIntro2024/26_RegularExpressions (последним исправлял пользователь FrBrGeorge 2024-10-27 16:11:39)