Сплит теги в питоне - PullRequest
       14

Сплит теги в питоне

4 голосов
/ 20 февраля 2009

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

<html>
  <head>
    <title> Hello! - {{ today }}</title>
  </head>
  <body>
    {{ runner_up }} 
         avasd
         {{ blabla }}
        sdvas
        {{ oooo }}
   </body>
</html>

Какой самый лучший или самый Pythonic способ извлечь {{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

Ответы [ 5 ]

8 голосов
/ 21 февраля 2009

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

Редактировать: это также работает против вашего нового примера :). В моем, очевидно, быстром тестировании, он, похоже, также обрабатывал некорректно сформированные теги, хотя я не даю никаких гарантий его надежности!

3 голосов
/ 21 февраля 2009

try templatemaker , создатель обратных шаблонов. он может фактически выучить их автоматически из примеров!

2 голосов
/ 21 февраля 2009

Я знаю, что вы сказали, что нет регулярных выражений / разбиений, но я не мог не попытаться найти решение на одну строку:

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']
1 голос
/ 21 февраля 2009

J.F. Себастьян написал это в комментарии, но я подумал, что это достаточно хорошо, чтобы заслужить свой ответ:

re.findall(r'{{(.+?)}}', thestring)

Я знаю, что ОП запрашивала способ, который не включал бы разбиения или регулярные выражения - так что, возможно, это не вполне отвечает на вопрос, как указано. Но эта строка кода определенно получает мой голос как самый Pythonic способ выполнить задачу.

1 голос
/ 21 февраля 2009

Если данные настолько просты, простое регулярное выражение выполнит свою задачу.

...