2012-05-30 4 views
4

Полностью новичок кодер здесь, первая публикация в этом прекрасном месте. Использование Python 3.2.3.Python textwrap и игнорирование частей строки

Краткое описание

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

фон

Я работаю с программой, которая выводит текст из .txt файлов, но не имеет WordWrap или разрывы строк. Поскольку я не могу редактировать функциональность программы, по крайней мере, пока, моя единственная опция - редактировать текстовые файлы.

Программа использует моноширинный шрифт фиксированного размера, поэтому я знаю конкретный счетчик символов для каждого файла &. Я использую команду жесткого пространства программы \ _ как символ заполнения для каждой завернутой строки (кроме последней). Команда hard-space временно преобразуется в #, чтобы сохранить правильные количества символов в моем скрипте.

Вот довольно измененная и упрощенная версия моего текста редактирования сценария:

from textwrap import TextWrapper 

linelist = ['"I thought that...\p glob was a weird\_name for a module."', 
"Nobody can tell a secret from the \p\shake{1}sky unless they borrow wings \ 
from their neighbors. It's a pity, really. Life on the ground can be a bore.", 
'\shake{6} The ground was trembling. What\wait{150} \pcould\wait{1300} the \ 
townfolk do? Even the pizzeria was closed.'] 

ww = TextWrapper(break_on_hyphens="False", width=30) 

def space_wordwrap(wwl): 
    out = [] 
    for ln in ww.wrap(wwl): 
     out.append("{0:#<{1:d}}".format(ln, ww.width)) 
     #just a quick workaround for simpler print output for SO question 
     if not ln in ww.wrap(wwl)[-1]: 
      out[-1] += "\n" 
    return ''.join(out).rstrip('#') 

for line in linelist: 
    #line = line.replace('\\_', '#') 
    if len(line) > ww.width: 
     line = space_wordwrap(line) 
    #line = line.replace('#', '\\_') 
    print(line + "\n") 

Проблема

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

Есть 4 команды: \p \wait{100} \stop{200} \shake{1}. См. Примеры linelist.

Выход сценария заключается в следующем:

"I thought that...\p glob was# 
a weird\_name for a module." 

Nobody can tell a secret from# 
the \p\shake{1}sky unless they 
borrow wings from their####### 
neighbors. It's a pity,####### 
really. Life on the ground can 
be a bore. 

\shake{6} The ground was###### 
trembling. What\wait{150}##### 
\pcould\wait{1300} the######## 
townfolk do? Even the pizzeria 
was closed. 

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

Моя первоначальная мысль заключалась в том, чтобы найти предыдущее слово (если оно есть) и использовать его в качестве ссылки. Я бы проверил, есть ли \ использовано, найдите пробел перед ним, за которым не следует \, сохраните это предыдущее слово в списке, а затем вставьте номер заказа в слово, если на нем есть много похожих слов. линия.

Whew! Это оказалось довольно длинным описанием. Любые предложения о том, как это сделать? Кроме того, если какой-либо из моих методов кодирования кажется глупым, я был бы рад узнать. В конце концов, все началось. : -]

Заранее благодарен!

ответ

1

много способов сделать это, но ...

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

Затем сделайте свою словесную упаковку.

Наконец, повторно вставьте команды.Возможно, вам придется пройти через окончательный текстовый символ по символу, чтобы вы могли игнорировать # символов и/n и/r при вычислении позиций символа команды.

Приблизительное решение, которое могло бы быть достаточно хорошим, состояло в том, чтобы заменить команды на символы места, которые, как вы знаете, не будут отображаться в исходном тексте, такие как @, ~, & и т. Д., В то время как переформатирование затем верните команды обратно. Выход не будет отлично завершен, так как некоторые линии могут иметь больше пробелов в конце, чем необходимо.

+0

Предварительная обработка и повторная установка. Думал так же, просто с неуклюжим методом. Большое спасибо! –

Смежные вопросы