Python Regex – определение первого и последнего элементов в списке

Мне нужно преобразовать текстовые файлы в HTML-код. Я застрял в преобразовании списка в неупорядоченный список HTML. Пример источника:

некоторый текст в документе
* пункт 1
* пункт 2
* пункт 3
другой текст

Выход должен быть:

some text in the document <ul> <li>item 1</li> <li>item 2</li> <li>item 3</li> </ul> some other text 

В настоящее время у меня есть:

 r = re.compile(r'\*(.*)\n') r.sub('<li>\1</li>', the_text_document) 

который создает список HTML без тегов < ul > .
Как я могу определить первый и последний элементы и окружить их тегами < ul > ?

3 Solutions collect form web for “Python Regex – определение первого и последнего элементов в списке”

Или используйте BeautifulSoup

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

редактировать

Я, видимо, должен дать вам некоторый намек на то, как читать документацию.

  • Открыть ссылку
  • Слева находится большое меню (цвет тика)
  • Если вы внимательно посмотрите, вы заметите, что документация разделена на несколько разделов
    • Stuffs
    • Навигация в дереве
    • Поиск дерева
    • Изменение дерева (получено)
    • Выход (получил!)

И многое другое

Beautiful Soup – это библиотека Python для вытаскивания данных из HTML и XML-файлов. Он работает с вашим любимым парсером, чтобы обеспечить идиоматические способы навигации, поиска и изменения дерева синтаксического анализа. Обычно это экономит время или время работы программистов .

Не прекращайте чтение после первого предложения … Последнее очень важно и что посередине.

Другими словами, вы можете создать пустой документ … пусть говорят:

 soup = BeautifulSoup("<div></div>") document = soup.div 

то вы читаете каждую строку текста, а затем делаете это, когда у вас есть текст.

 document.append(line) 

если строка начинается с `*` `

 ul = document.new_tag('ul') document.append(ul) document = ul 

затем нажмите все li на документе … и как только вы закончите чтение * , просто введите родителя, чтобы документ вернулся к div. И продолжайте делать это … вы можете даже сделать это рекурсивно, чтобы вставить ul в ul s.

Когда вы все разобрали … вы можете сделать

 str(document) 

или

 document.prettify() 

редактировать

просто понял, что вы не редактировали html, а неформатированный текст. Тогда вы можете попробовать использовать markdown.

http://daringfireball.net/projects/markdown/

Вы можете просто обрабатывать данные по строкам. Это быстрое и грязное решение ниже, вероятно, можно было бы убрать, но для ваших данных это делает трюк.

 with open('data.txt') as inf: star_count = 0 for line in inf: line = line.strip() if not line.startswith('*'): if star_count == 1: print'</ul>' print line else: if star_count == 0: print '<ul>' star_count = 1 print ' <li>%s</li>' %line.split('*')[1].strip() 

выходы:

 some text in the document <ul> <li>item 1</li> <li>item 2</li> <li>item 3</li> </ul> some other text 

В зависимости от того, насколько сложны ваши данные или если у вас повторяются неупомянутые списки и т. Д., Это потребует внесения изменений, и вы можете захотеть найти более общее решение или изменить этот код стартера, чтобы удовлетворить ваши потребности, только вы можете решить.

Обновление :

Отредактированная строка <li> .. </li> чтобы избавиться от * которые были ранее оставлены.

После игры с некоторыми идеями, я решил пойти со вторым регулярным выражением. Итак, в основном, после запуска первого регулярного выражения (из моего исходного сообщения, который создает теги <li> ), я запускаю:

 r = re.compile(r'(<li>.*?</li>\n(?!\s*<li>))', re.DOTALL) r.sub('<ul>\\1</ul>', string_with_li_tags) 

Это найдет первое совпадение <li> и последнее совпадение </li>\n комбо, за которым следует тэг <li> (который по существу означает весь список) и добавляет теги <ul> .

EDIT: я немного изменил регулярное выражение, чтобы оно не было жадным. Таким образом, он может обрабатывать несколько списков в одном документе. Только требование состоит в том, что между элементами списка нет пробелов, так как @Aprillion, упомянутый ниже

РЕДАКТИРОВАТЬ 2: Изменен негативный просмотр для обработки пробелов между элементами списка, так что все случаи охвачены

  • существует ли необходимость в более декларативном способе выражения регулярных выражений? :)
  • Регулярное выражение для замены некоторых точек запятыми в комментариях клиентов
  • регулярное выражение python находит и заменяет тег html определенным значением атрибута
  • Как удалить все после последнего числа в строке
  • Заменить текст в примере HTML и BBCode
  • Удалить скобки и текст в файле с помощью Python
  • python re: return True, если регулярное выражение содержит строку
  • Как найти многострочный текст между фигурными фигурными скобками?
  • Реверсирование регулярного выражения в Python
  • Найти индексы всех совпадений регулярных выражений в Python?
  • Регулярное выражение Python: как исключить суперструны?
  •  
    Interesting Posts for Van-Lav

    Каков приоритет оператора при написании двойного неравенства в Python (явно в коде и как это можно переопределить для массивов?)

    Разбор огромных, плохо закодированных XML-файлов в Python

    Потоковая передача POST большого файла на CherryPy от клиента Python

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

    Интерактивная отладка с nosetests в PyDev

    Почему Алгоритм обучения Перцептрона не сходится?

    Проверка уникальности всех элементов в списке

    Строки из двух букв и фиксированной длины

    Многопроцессор Python с распределенным кластером

    Добавьте n задач в очередь сельдерея и дождитесь результатов

    Изображения из ImageField в Django не загружаются в шаблон

    Методы без тестирования в тестовой среде Python

    Репликация строк в кадре данных pandas значением столбца

    Реализация команды find Linux в python

    как конкатенировать объекты 'str' и 'tuple'

    Python - лучший язык программирования в мире.