完全是初学者在这里,第一次张贴在这个好地方。使用Python3.2.3。
快速描述
我想用wordwrap和char填充字符串,但是字符串的某些部分应该被忽略。
背景
我正在使用一个从.txt文件输出文本的程序,但没有换行符或换行符。因为至少目前我不能编辑程序的功能,所以我唯一的选择是编辑文本文件。
程序使用固定大小的单空格字体,因此我知道每个文件行的特定字符数。我使用程序的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")

问题
文本文件中的许多行包含程序的命令程序不会将这些命令显示为文本,但它们的位置很重要…它们被放置在可显示文本周围的任何地方。这会使wrap的字符数减少。
有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.

我想我必须删除行中的程序命令,然后在换行后将它们插入各自的位置,但我不确定什么是最干净的方法。
我最初的想法是找到前一个单词(如果有的话)并以此作为参考。我会检查是否有使用过的,在前面找一个空格,后面不跟一个,把前面的单词存储在一个列表中,然后在单词上插入一个顺序号,以防行上有很多相似的单词。
呼!这是一个相当长的描述。有什么建议吗?另外,如果我的任何编码实践看起来很愚蠢,我很高兴知道。毕竟还是刚刚开始。:-]
提前谢谢!

最佳答案

有很多方法可以做到,但是…
预先处理文本,删除命令并记住它们的位置,作为文本开头的字符偏移量。
那就把你的话包装一下。
最后重新插入命令。您可能需要逐字逐行查看最终文本,以便在计算命令字符位置时忽略字符和/n和/r。
一个近似的解决方案,可能是足够好的,是将替换的命令与位置持有人字符,你知道不会出现在源文本,如@,~,和等,而重新格式化完成,然后把命令在后面。输出将不会被完美地包装,因为有些行的末尾可能有多余的空格。

10-01 03:36
查看更多