这里有一个初学者编码器,首先发布在这个好地方。使用Python 3.2.3。
简要说明
我想用wordwrap和char-fill字符串,但字符串的某些部分应该被忽略。
背景
我正在使用一个从.txt文件输出文本的程序,但没有wordwrap或换行符。由于我至少暂时无法编辑程序的功能,我唯一的选择就是编辑文本文件。
该程序使用固定大小的等宽字体,因此我知道每个文件的特定字符数。线。我正在使用程序的硬空间命令\ _作为每个包装行(最后一个除外)的填充字符。硬空间命令暂时转换为#,以便在我的脚本中保持正确的字符数。
这是我的文本编辑脚本的一个相当改变和简化的版本:
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")
问题
文本文件中的许多行都包含程序的命令。这些命令不会被程序显示为文本,但它们的位置很重要......它们放在可显示文本的任何位置。这会丢弃wordwrap的字符数。
共有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后将它们插回各自的位置,但我不确定最简洁的方法是什么。
我最初的想法是找到前一个单词(如果有的话)并将其用作参考。我已经检查了是否有一个\ used,在它之前找到一个没有后跟的空格,将前一个单词存储在列表中,然后在单词上插入一个订单号,以防有很多类似的单词线。
呼!结果证明这是一个非常冗长的描述。有关如何做的任何建议?此外,如果我的任何编码实践看起来很愚蠢,我很高兴知道。毕竟,还是刚开始。 : - ]
提前致谢!
答案 0 :(得分:1)
许多方法可以做到这一点,但......
预处理文本,删除命令并记住它们的位置,作为从文本开头偏移的字符。
然后做你的自动换行。
最后重新插入命令。您可能需要逐个字符逐步查看最终文本,以便在计算命令字符位置时可以忽略#字符和/ n和/ r。
一个近似的解决方案,可能是足够好的,将替换命令与你知道不会出现在源文本中的占位符字符,如@,〜,&amp;等等,而重新格式化是完成后,然后再将命令放回去。输出将不会被完美地包裹,因为某些行的末尾可能有比所需更多的空格。