Разделять теги в python
-
05-09-2019 - |
Вопрос
У меня есть файл, который содержит это:
<html>
<head>
<title> Hello! - {{ today }}</title>
</head>
<body>
{{ runner_up }}
avasd
{{ blabla }}
sdvas
{{ oooo }}
</body>
</html>
Каков наилучший или наиболее питонический способ извлечения {{today}}
, {{runner_up}}
, и т.д.?
Я знаю, что это можно сделать с помощью разбиений / регулярных выражений, но мне было интересно, есть ли другой способ.
PS:рассмотрим данные, загруженные в переменную, называемую thedata
.
Редактировать:Я думаю, что пример HTML был плохим, потому что он направил некоторых комментаторов к BeautifulSoup.Итак, вот новые входные данные:
Fix grammatical or {{spelling}} errors.
Clarify meaning without changing it.
Correct minor {{mistakes}}.
Add related resources or links.
Always respect the original {{author}}.
Выходной сигнал:
spelling
mistakes
author
Решение
Mmkay, ну вот генераторное решение, которое, кажется, хорошо работает для меня.Вы также можете предоставить различные теги открытия и закрытия, если хотите.
def get_tags(s, open_delim ='{{',
close_delim ='}}' ):
while True:
# Search for the next two delimiters in the source text
start = s.find(open_delim)
end = s.find(close_delim)
# We found a non-empty match
if -1 < start < end:
# Skip the length of the open delimiter
start += len(open_delim)
# Spit out the tag
yield s[start:end].strip()
# Truncate string to start from last match
s = s[end+len(close_delim):]
else:
return
Запустите против вашего целевого ввода вот так:
# prints: today, runner_up, blabla, oooo
for tag in get_tags(html):
print tag
Редактировать:это также работает против вашего нового примера :).В моем явно быстром тестировании также показалось, что он разумным образом обрабатывает искаженные теги, хотя я не даю никаких гарантий его надежности!
Другие советы
попробуй создатель шаблонов, создатель обратного шаблона.на самом деле он может автоматически выучить их из примеров!
Я знаю, вы сказали, что нет регулярных выражений / разделения, но я не мог не попробовать однострочное решение:
import re
for s in re.findall("\{\{.*\}\}",thedata):
print s.replace("{","").replace("}","")
Редактировать:JFS
Сравнить:
>>> re.findall('\{\{.*\}\}', '{{a}}b{{c}}')
['{{a}}b{{c}}']
>>> re.findall('{{(.+?)}}', '{{a}}b{{c}}')
['a', 'c']
Если данные настолько понятны, то простое регулярное выражение сделало бы свое дело.
Дж .Ф.Себастьян написал это в комментарии, но я подумал, что это было достаточно хорошо, чтобы заслужить свой собственный ответ:
re.findall(r'{{(.+?)}}', thestring)
Я знаю, что OP просил способ, который не включал бы разделения или регулярные выражения - так что, возможно, это не вполне ответьте на вопрос, как указано.Но эта одна строка кода определенно получает мой голос как наиболее питонический способ выполнения задачи.