Полностью новичок кодер здесь, первая публикация в этом прекрасном месте. Использование 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! Это оказалось довольно длинным описанием. Любые предложения о том, как это сделать? Кроме того, если какой-либо из моих методов кодирования кажется глупым, я был бы рад узнать. В конце концов, все началось. : -]
Заранее благодарен!
Предварительная обработка и повторная установка. Думал так же, просто с неуклюжим методом. Большое спасибо! –