На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > (Python) Сложная замена строк , <s repeat="2">text</s> => <s>text</s><s>text</s>
      Предыстория:
      Есть content.xml, выдранная из документа формата OpenOffice (*.odt).
      Эта xml используется неким простым парсером, в который мы условно не можем вносить изменения.
      Между ними есть скрипт, написанный на Python, который распаковывает эту xml и попутно разрешает в ней разные проблемы.

      Сегодня столкнулся с новой любопытной проблемой:
      OpenOffice находит одинаковые строки, стоящие рядом и группирует их.

      Другими словами, было:
      ExpandedWrap disabled
        <table:table-cell office:value-type="string" calcext:value-type="string">Теги и текст</table:table-cell><table:table-cell office:value-type="string" calcext:value-type="string">Теги и текст</table:table-cell>
      стало:
      ExpandedWrap disabled
        <table:table-cell table:number-columns-repeated="2" office:value-type="string" calcext:value-type="string">Теги и текст</table:table-cell>


      Задача:
      Нужно как-то развернуть сгруппированный текст, с указанным числом повторений в исходный.
      То есть, у нас где-то в тексте есть:
      ExpandedWrap disabled
        <some-tag repeat="n">Some complex info</some-tag>
      а вместо этого мы должны получить повторённое n раз:
      ExpandedWrap disabled
        <some-tag>Some complex info</some-tag>


      Собственно, как такое лучше провернуть?
      Производительность не важна.
        на Lua,например, так
        ExpandedWrap disabled
          local s=[[<some-tag repeat="4">Some complex info</some-tag>]]
          print(
              (s:gsub(
                  '<(.-)%s+repeat="(%d)">(.-)</%1>',
                  function(tag,count,cont)
                      return ('<'..tag..'>'..cont..'</'..tag..'>'):rep(count)
                  end
              ))
          )
          В общем, решил в лоб
          ExpandedWrap disabled
            def fix_identical_compression(text):
                fixedText = text
                # exclude empty cells
                badResult = re.compile('<table\:table\-cell\s+table\:number\-columns\-repeated\=\"\d+\"(?!>)*?/>')
                fixedText = badResult.sub("", fixedText)
             
                r = re.compile('<table\:table\-cell\s+table\:number\-columns\-repeated\=\"(\d+)\".*?>.*?</table\:table\-cell>')
                while r.search(fixedText):
                    res = r.search(fixedText, 1)
                    groups = res.groups()
                    unresult = re.compile('\stable\:number\-columns\-repeated\=\"\d+\"')
                    fixedGroup = unresult.sub("", res.group())
                    fixedText = r.sub(fixedGroup * int(groups[0]), fixedText, 1)
             
                return fixedText
          Сообщение отредактировано: WhyNot -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0279 ]   [ 15 queries used ]   [ Generated: 27.04.24, 18:23 GMT ]