@JustMoose
Программист. Радиолюбитель. Прокрастинатор ;)

Как подобрать примитивный парсер?

Всем привет!
У меня есть задача, и я не понимаю, как её лучше всего решить.

Есть некоторая строка.
Например:
<img src="some.jpg">

Я хочу разбить её на части. Руками это делать не хочется, ибо на 100500 реализации становится просто скучно. Использовать регулярки тоже не хочется (во-первых, я их не знаю, а во вторых, они слишком монструозные).
А хочется какой-нибудь магии.
Например, парсера, который бы мог принять на вход строку вида:
"<%s=\"%s\">"
и мою строку, и отдал бы на выходе два значения.

Я знаю, что обратная задача решается в printf.
А вот где бы взять такой scanf, да ещё и в Python-е...

И есть ли в живой природе вообще хоть один сканер/парсер, который бы нормально принимал строку, которая очень похожа на ожидаемую входную, и только вместо параметров (которые оттуда надо выковырять) стоят спецификаторы?
  • Вопрос задан
  • 310 просмотров
Решения вопроса 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Парсер xml, либо html вам в помощь
>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring('<img src="some.jpg"></img>')
>>> root
<Element 'img' at 0x104bd5458>
>>> root.get('src')
'some.jpg'
>>> root.tag
'img'


Хочется велосипедов - сделайте сами магию:
>>> def some_magic(patt, str_in):
...     import re
...     patt = patt.replace('%s', '(.*)')
...     res = re.match(patt, str_in)
...     return res.groups()
... 
>>>
>>> print(some_magic('<%s=\"%s\">', '<img src="some.jpg">')) 
('img src', 'some.jpg')
Ответ написан
Есть простой модуль parse.
import parse
s = '<img src="some.jpg">'
p = '<{}="{}">'
parse.parse(p, s)

На выходе получите список найденных подстрок.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MadridianFox
Web-программист, многостаночник
Вы хотите регулярные выражения, но не хотите регулярные выражения потому что они сложные.
Ок, просто не используйте все возможности регулярных выражений.
Ваш пример можно описать регуляркой вот так: /<([\w-_]+)\s+src="([^"]+)">/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы