Всем привет!
У меня есть задача, и я не понимаю, как её лучше всего решить.
Есть некоторая строка.
Например: <img src="some.jpg">
Я хочу разбить её на части. Руками это делать не хочется, ибо на 100500 реализации становится просто скучно. Использовать регулярки тоже не хочется (во-первых, я их не знаю, а во вторых, они слишком монструозные).
А хочется какой-нибудь магии.
Например, парсера, который бы мог принять на вход строку вида: "<%s=\"%s\">"
и мою строку, и отдал бы на выходе два значения.
Я знаю, что обратная задача решается в printf.
А вот где бы взять такой scanf, да ещё и в Python-е...
И есть ли в живой природе вообще хоть один сканер/парсер, который бы нормально принимал строку, которая очень похожа на ожидаемую входную, и только вместо параметров (которые оттуда надо выковырять) стоят спецификаторы?
Владимир Куц, (.*) вроде должен сожрать всё до конца строки. Лучше сделать несколько более определённых постановок, типа: %tag - ([\w-_]+), %quoted - ([^"]+) и т.д.
(upd) Владимир Куц, Спасибо, конвертер %s в регулярку - кажется достаточно красивым решением.
Про etree - я от него сознательно отказался. Потому что он лажает.
Например, у меня он отдаёт пустую строку, если внутри xml тега встретился какой-то другой тег О_О
Иван Корюков, конечно можно сделать лучше. Я просто привел решение "в лоб". По сути это то чего хочет топикстартер - синтаксический сахар для регулярных выражений.
(upd) Иван Корюков, Эмммм. Я не очень люблю, когда окружающие лучше меня знают, чего я хочу, ну да ладно. Иногда они даже угадывают (хотя бы потому, что они уже бегали по граблям, а я - нет!) :)
Попробую пояснить, что не так в данном случае.
Очень абстрактный пример:
задача: получить на вход два числа, вычислить их сумму, вывести результат
что предполагают окружающие: наверное ему нужен интерпретатор, а то вдруг ему не только сложение понадобиться, точно, расскажу ка я ему про yacc...
В результате исходная задача разрастается из одного scanf и одного printf в ахапку модулей, которые могут абсолютно всё, но абсолютно не используются. А потом оказывается, что это ещё и поддерживать нужно.
Я не против общих решений. Но иногда нужно что-то мелкое и примитивное. И совсем не нужен over engineering.
Итого: я понимаю, что есть регулярки. Но моя задача слегка иная: найти готовое решение, которое умеет сравнить шаблон со строкой. И чтобы это шаблон читался. Мной. Не компом :)
Сравни пару строк: Антон Б: p = '<{}="{}">'
твоя: /<([\w-_]+)\s+src="([^"]+)">/
Какая читабельней?
Вы хотите регулярные выражения, но не хотите регулярные выражения потому что они сложные.
Ок, просто не используйте все возможности регулярных выражений.
Ваш пример можно описать регуляркой вот так: /<([\w-_]+)\s+src="([^"]+)">/
Эммм. Я точно знаю, что мои входные строки будут состоять из знаков препинания и подстрок. Зачем мне использовать невнятные регулярки там, где достаточно просто написать %s??
Вова, как раз таки %s менее внятно чем ([\w-_]+), т.к. во втором случае мы явно указываем что хотим найти. Причина по которой вы не хотите использовать регулярки звучит довольно смешно, можно провести аналогию с желанием иметь волшебную кнопку, которая делает вам программу, т.к. писать руками долго и выглядит он сложно.