Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.59.122.162] |
|
Сообщ.
#1
,
|
|
|
Предыстория:
Есть content.xml, выдранная из документа формата OpenOffice (*.odt). Эта xml используется неким простым парсером, в который мы условно не можем вносить изменения. Между ними есть скрипт, написанный на Python, который распаковывает эту xml и попутно разрешает в ней разные проблемы. Сегодня столкнулся с новой любопытной проблемой: OpenOffice находит одинаковые строки, стоящие рядом и группирует их. Другими словами, было: <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> <table:table-cell table:number-columns-repeated="2" office:value-type="string" calcext:value-type="string">Теги и текст</table:table-cell> Задача: Нужно как-то развернуть сгруппированный текст, с указанным числом повторений в исходный. То есть, у нас где-то в тексте есть: <some-tag repeat="n">Some complex info</some-tag> <some-tag>Some complex info</some-tag> Собственно, как такое лучше провернуть? Производительность не важна. |
Сообщ.
#2
,
|
|
|
на Lua,например, так
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 )) ) |
Сообщ.
#3
,
|
|
|
В общем, решил в лоб
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 |