gpt4 book ai didi

Python textwrap 和忽略部分字符串

转载 作者:太空宇宙 更新时间:2023-11-03 11:55:46 26 4
gpt4 key购买 nike

这里完全是编码初学者,第一次在这个好地方发帖。使用 Python 3.2.3。

简要说明

我想对字符串进行自动换行和字符填充,但应该忽略字符串的某些部分。

背景

我正在使用一个从 .txt 文件输出文本的程序,但没有自动换行或换行符。由于至少目前我无法编辑程序的功能,所以我唯一的选择是编辑文本文件。

该程序使用固定大小的等宽字体,所以我知道每个文件和行的具体字符数。我使用程序的硬空间命令\_ 作为每个包装行的填充字符(最后一行除外)。硬空格命令暂时转换为 # 以在我的脚本中保持正确的字符数。

这是我的文本编辑脚本的经过相当改动和简化的版本:

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.

我想我必须从行中删除程序命令,然后在自动换行后将它们插入到各自的位置,但我不确定最干净的方法是什么。

我最初的想法是找到之前的单词(如果有的话)并将其用作引用。我会检查是否使用了\,在它之前找到一个没有后面跟着\的空格,将前一个单词存储在列表中,然后在该单词上插入一个订单号,以防万一有很多相似的单词行。

哇!事实证明这是一个相当冗长的描述。关于如何完成的任何建议?此外,如果我的任何编码实践看起来很愚蠢,我很乐意知道。毕竟才刚刚开始。 :-]

提前致谢!

最佳答案

有很多方法可以做到这一点,但是......

预处理文本,删除命令并记住它们的位置,作为文本开头的字符偏移量。

然后进行自动换行。

最后重新插入命令。您可能需要逐个字符地遍历最终文本,以便在计算命令字符位置时可以忽略 # 个字符以及/n 和/r。

一个可能足够好的近似解决方案是在重新格式化完成时用您知道不会出现在源文本中的占位符替换命令,例如 @、~、& 等,然后将命令放回原处。输出不会被完美包裹,因为某些行末尾的空格可能比必要的多。

关于Python textwrap 和忽略部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10813793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com