1 Востаннє редагувалося maryX (02.06.2018 18:57:35)

Тема: Перевірка на коректність вводу по заданому правилу

Всім привіт) Python почала вчити зовсім недавно і потрібна ваша допомога з цим завданням:
Користувач задає в текстовому файлі деяку комбінацію(-ї, тобто можна декілька через кому), яку програма повинна перевіряти на відповідність такому правилy: ім'я [індексне вираз], де
ім'я складається з букв,
індексний вираз - це одне, два або три цілих десяткових числа, які відокремлюються комами.
Не знаю, як зробити так, щоб програма розпізнавала квадратні дужки в заданому користувачем рядку і як організувати перевірку для індексного значення ??

Ось знайшла щось схоже

import re
pattern = re.compile("^[a-zA-Z]+\ ?(<|>|>=|<=|<>|=)\ ?[0-9]+$")
with open('grammar.txt', 'r') as f:
        strings = f.readline().split(',')
        for string in strings:
            if pattern.match(string):
                print('{} match'.format(string))
            else:
                print('{} invalid'.format(string))

Допоможіть, будь ласкаааа)

2

Re: Перевірка на коректність вводу по заданому правилу

maryX написав:

Ось знайшла щось схоже

Хіба в заголовку сайту сайту написано "форум людей, що шукають щось схоже на потрібне"?
Ви вчитеся на програміста - то програмуйте. Щось не виходить - питайте, що саме. Не хочете програмувати - це форум не для вас.

3 Востаннє редагувалося P.Y. (03.06.2018 08:12:46)

Re: Перевірка на коректність вводу по заданому правилу

Якщо брати за основу даний приклад, то, очевидно, слід змінити лише шаблон пошуку в другому рядку — решта має працювати (втім, див. нижче про split). Тобто, в такому варіанті виходить задача не на власне python, а на регулярні вирази (бібліотеки для яких є в більшості мов програмування, актуальних у наш час). У даному прикладі, шаблон відповідає виразові "ім'я оператор_порівняння число" (де оператор_порівняння може бути <, >, <=, >=, <>, =), перед та після оператора можуть стояти необов'якові пробіли. Ще одне: оскільки в шаблонах часто використовується «\» (який також має спеціальне значення і в звичайних рядках), перед рядком з регуляркою зазвичай ставлять літеру r, щоб зберегти «\» неушкодженим: r"^...$"

Квадратні дужки в регулярних виразах мають спеціальне значення, тому, щоб вказати, що це просто квадратна дужка, перед нею ставиться «\»: \[ та \]
Тобто, одному індексу в квадратних дужках відповідає частина шаблону \[[0-9]+\]

Індекси, яких може бути один або декілька: другий індекс (разом з комою перед ним) є необов'язковим. Необов'язковість у регулярках позначається знаком питання, а увесь необов'язковий вираз слід узяти в круглі дужки: (,[0-9]+)?
Додаткових індексів у нас може бути від нуля до двох. Кількість повторів задається у фігурних дужках: (,[0-9]+){0,2}
Або ж можна обійтися самими знаками питання: (,[0-9]+(,[0-9]+)?)? — проте, такий варіант дещо гірший.

Таким чином, увесь 2-й рядок програми матиме такий вигляд:

pattern = re.compile(r"^[a-zA-Z]+\[[0-9]+(,[0-9]+){0,2}\]$")

До речі, вже бачу проблему: якщо вирази відокремлюються комами (рядок 4) , то будь-який вираз з двома чи більше індексами, пропущений через .split(','), буде розбито на декілька виразів, кожен з яких оброблятиметься окремо і, відповідно, вважатиметься невалідним. Тобто, треба думати, як це обійти (в найпростішому випадку, можна не розбивати введений рядок на підрядки — тоді такий вираз вважатиметься валідним, але можливості ввести декілька виразів у рядку не буде).

Якщо регулярки для вас є темною магією (що типово для початківців), то, можливо, краще спробувати розв'язати задачу алгоритмічно, циклічно перебираючи символ за символом — програма значно збільшиться в розмірі, але, принаймні, ви зможете зрозуміти, що ваша програма робить. Також, мабуть, доведеться робити такий перебір, щоб замінити стандартний split, який надто примітивний, щоб зробити те, що вимагається в умовах задачі — вам треба розбити рядок на підрядки, розділені комами, але при цьому коми, що всередині квадратних дужок, обробити не як роздільники, а як звичайні символи.

Подякували: maryX1

4

Re: Перевірка на коректність вводу по заданому правилу

Сесія близько.
Студенти копіюють програми для лабораторних з дискретної математики (або теорії автоматів).
Якщо бачите

maryX написав:

щось схоже

import re
pattern = re.compile("^[a-zA-Z]+\ ?(<|>|>=|<=|<>|=)\ ?[0-9]+$")
with open('grammar.txt', 'r') as f:
    strings = f.readline().split(',')
    for string in strings:
        if pattern.match(string):
            print('{} match'.format(string))
        else:
            print('{} invalid'.format(string))

, - це студенти "робили" Ctrl+C, Ctrl+V.