поиск и замена: преобразовать квадратные скобки в теги XML - PullRequest
1 голос
/ 22 июня 2011

Я постараюсь держать это коротко и точно.

Учитывая следующее

#!/usr/bin/python
from lxml import etree

root = etree.Element('root')
sect = etree.SubElement(root,'sect')
para = etree.SubElement(sect,'para')
para.text = 'this is a [b]long[/b] block of text. Much longer than this example makes it out to be.'

как мне лучше всего преобразовать вывод в то, что у меня ниже? обратите внимание, что [b] стало элементом <b>

<root> 
  <sect>
    <para>
       this is a <b>long</b> block of text. 
      Much longer than this example makes it out to be.
    </para>
  </sect>
</root>

Мой реальный ввод и xml значительно сложнее. Тем не менее, это суть этого. Я взял стандартно отформатированный текстовый документ и конвертирую его в xml. Структура документа довольно статична. Поэтому это не так безумно, как кажется. В настоящее время я разбил его на строки. Это актуально, потому что, проходя каждую строку, у меня нет проблем с идентификацией <sect> или <title>, но часто <para> будет иметь дополнительное форматирование в своей строке. В этом примере, [b], который должен быть преобразован еще раз. Как лучше всего это сделать?

Что нужно иметь в виду

  1. авторы моих входных текстов не всегда последовательны. следовательно, было бы лучше разработать потерянное регулярное выражение, чтобы найти [b] WORD [/ b] или когда авторы ошибаются чем-то вроде [b [WORD [/ b]. моя текущая идея состоит в том, чтобы соответствовать что-то вроде [b или b]

  2. В настоящее время я обрабатываю свой входной файл построчно. Я удалил все пустые строки. я должен рассмотреть обработку этого позже? У меня нет сильной цели, но я чувствую, что это может быть заключено в один цикл текста.

  3. Это должно хорошо работать с lxml при выводе документа. например, см. редактирование ниже с моим комментарием к парсеру bbc

Я работал над этим большую часть дня и могу обсудить больше маршрутов, которые я выбрал. Я буду работать над этим в течение всего вечера, поэтому, если я буду сталкиваться с другими вещами, чтобы иметь в виду, я обновлю этот вопрос соответственно.

РЕДАКТИРОВАТЬ: Или моя проблема с парсером BBC

Пол задумчиво предложил postmarkup-1.1.4 , однако, как вы можете заметить, он плохо работает с lxml. преобразование элементов в сущности. Это была проблема, с которой я столкнулся сегодня днем, когда сделал это через поиск и замену. В конечном счете, это идеальное решение для sed. Как было указано. Однако я надеялся, что не стану конечным пользователем этого скрипта, и предпочел бы все, что содержится в одной команде.

>>> p.text = render_bbcode(p.text)
>>> p.text
'this is a <strong>long</strong> text string'
>>> etree.tostring(root)
'<root><p>this is a &lt;strong&gt;long&lt;/strong&gt; text string</p></root>'

если сделать это в обратном порядке, результат будет одинаково плохим

 >>> p.text
 'this is a [b]long[/b] text string
 >>> render_bbcode(etree.tostring(root))
 u'&lt;root&gt;&lt;p&gt;this is a <strong>long</strong> string&lt;/p&gt;&lt;/root&gt;'

1 Ответ

2 голосов
/ 22 июня 2011

Библиотека postmarkup кажется наиболее близкой к тому, что вы хотите сделать.

http://pypi.python.org/pypi/postmarkup/1.1.4

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

Начиная с этого момента и модифицируя существующие элементы в соответствии с вашим синтаксисом, вероятно, быстрее, чем изобретать колесо синтаксического анализа с нуля.

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

И последнее замечание: именно такие задачи были написаны для выполнения sed. Он может быть удивительно мощным, если вы хотите научиться им пользоваться. Если вам это пока не нравится, возможно, Python будет проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...