Парсинг строки из json для html

179
12 января 2019, 12:50

Из JSON извлекается список данных такого формата:

('p.my-class#my-id', 'hello')

Проблема заключается в том, чтобы парсить ключ на tag, id и список classes.

На выходе должно получиться следующее:

'<p id="my-id" class="my-class">hello</p>'

Есть такое неудачное решение:

def getTagClassesId(s): # не учтено что ID может идти до или между классами
    """получение тега, класса и айди из элемента словаря"""
    _tag, _class, _id = None, None, None
    n_class, n_id = s.count('.'), s.count('#')
    if n_id > 0:
        s, _id = s.split('#')
    if n_class > 0:
        s = s.split('.')
        _class = s[1:]
        s = s[0]
    _tag = s
    return _tag, " ".join(_class), _id

Возможно есть готовая пакетная функция которая позволит избавиться от нужды в написании своей ф-ии парсинга ??

Answer 1

Реализация через регулярные выражения:

import re

def get_tag_classes_id(text: str) -> (str, str, str):
    class_ = []
    id_ = ''
    tag, *items = re.split('[#.]', text)
    prefixs = re.findall('[#.]', text)
    for prefix, value in zip(prefixs, items):
        if prefix == '#':
            id_ = value
        else:
            class_.append(value)
    return tag, ' '.join(class_), id_

print(get_tag_classes_id('p.my-class.my-class2#my-id'))
print(get_tag_classes_id('p.my-class'))
print(get_tag_classes_id('p#my-id'))
print(get_tag_classes_id('p'))

Консоль:

('p', 'my-class my-class2', 'my-id')
('p', 'my-class', '')
('p', '', 'my-id')
('p', '', '')

PS. первоначально делал через другой алгоритм с регулярками, но мне он показался громоздким:

def get_tag_classes_id(text: str) -> (str, str, str):
    match = re.search('(.+?)[.#]', text)
    if not match:
        return text, '', ''
    tag = match[1]
    # Текст без тега
    text = text[len(tag):]
    items = re.findall(r'[.#][\w-]+', text, flags=re.IGNORECASE)
    id_ = ''
    class_ = []
    for x in items:
        prefix, value = x[0], x[1:]
        if prefix.startswith('#'):
            id_ = value
        else:
            class_.append(value)
    return tag, ' '.join(class_), id_
Answer 2

Если данные всегда в таком "виде", можно вот так:

import ast
tpl = ('p.my-class#my-id', 'hello')
ostr = tpl[0][1:]
ostr = ostr.replace('.', '\'class\':\'')
ostr = ostr.replace('#', '\', \'id\': \'')
ostr = f"{{{ostr}'}}"
odict = ast.literal_eval(ostr)
print(f"<p id=\"{odict['id']}\" class=\"{odict['id']}\">{tpl[1]}</p>")

Вывод:

<p id="my-id" class="my-id">hello</p>
READ ALSO
Как сверстать такой резиновый svg блок?

Как сверстать такой резиновый svg блок?

Как сделать svg блок такой формы?:

152
Поиск последнего вхождения в строке Jquery

Поиск последнего вхождения в строке Jquery

Нужно получать последнее слово в квадратных скобках, то есть code из строки

128
Калькулятор с select

Калькулятор с select

Вопрос: как вычислять по выбранному селекту?

134
Как подключить jquery плагин galereya?

Как подключить jquery плагин galereya?

Нужна помощь, хочу на сайте для галереи с фотографиями использовать этот плагинАльтернатив не нашел и хочу использовать именно его

150