4

ここでは完全に初心者のコーダーであり、この素晴らしい場所に初投稿します。Python 3.2.3 を使用。

簡単な説明

文字列をワードラップして文字で埋めたいのですが、文字列の一部を無視する必要があります。

バックグラウンド

.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")

問題

テキスト ファイルの多くの行には、プログラムのコマンドが含まれています。これらのコマンドは、プログラムによってテキストとして表示されませんが、配置は重要です...そして、表示可能なテキストの周りのどこにでも配置されます。これにより、ワードラップの文字数が失われます。

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.

プログラムコマンドを行から削除し、ワードラップ後にそれぞれの場所に挿入する必要があると思いますが、それを行う最もクリーンな方法はわかりません。

私の最初の考えは、前の単語 (もしあれば) を見つけて、それを参照として使用することでした。\ が使用されているかどうかを確認し、その前に \ が続かないスペースを見つけ、その前の単語をリストに保存し、その単語に類似した単語が多数ある場合に備えて、単語に順序番号を挿入します。ライン。

うわー!かなり長い説明になりました。それをどのように行うべきかについての提案はありますか?また、私のコーディング プラクティスのいずれかがばかげていると思われる場合は、喜んでお知らせします。結局のところ、まだ始まったばかりです。:-]

前もって感謝します!

4

1 に答える 1

1

これを行う多くの方法ですが...

テキストを前処理し、コマンドを削除して、テキストの先頭からの文字オフセットとしてコマンドがどこにあったかを記憶します。

次に、ワードラッピングを行います。

最後にコマンドを再挿入します。コマンド文字の位置を計算するときに # 文字、/n および /r を無視できるように、最終的なテキストを 1 文字ずつ処理する必要がある場合があります。

おおよその解決策としては、コマンドを、@、~、& などのソース テキストに表示されないことがわかっているプレースホルダー文字に置き換えて、再フォーマットが行われるようにすることです。コマンドは後で元に戻します。一部の行の末尾に必要以上のスペースが含まれている可能性があるため、出力は完全に折り返されません。

于 2012-05-30T10:51:42.170 に答える