Вопрос

У меня есть файл, который содержит это:

<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 просил способ, который не включал бы разделения или регулярные выражения - так что, возможно, это не вполне ответьте на вопрос, как указано.Но эта одна строка кода определенно получает мой голос как наиболее питонический способ выполнения задачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top