Из 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
Возможно есть готовая пакетная функция которая позволит избавиться от нужды в написании своей ф-ии парсинга ??
Реализация через регулярные выражения:
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_
Если данные всегда в таком "виде", можно вот так:
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>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно получать последнее слово в квадратных скобках, то есть code из строки
Нужна помощь, хочу на сайте для галереи с фотографиями использовать этот плагинАльтернатив не нашел и хочу использовать именно его