web-dev-qa-db-ja.com

長い文字列を改行にラップする良い方法は?

私のプロジェクトには、ファイルから読み込まれる文字列がたくさんあります。それらのほとんどは、コマンドコンソールで印刷すると、長さが80文字を超え、折り返されてlookingいように見えます。

Python文字列を読み取ってから、長さが75文字を超えているかどうかをテストします。そうであれば、文字列を複数の文字列に分割し、その他の新しい行。また、完全な単語をカットするのではなく、スマートにしたい、つまり_"The quick brown <newline> fox..."_の代わりに_"the quick bro<newline>wn fox..."_にしたい。

設定された長さの後に文字列を切り詰める同様のコードを変更しようとしましたが、新しい行に入れるのではなく、文字列を破棄します。

これを達成するために使用できる方法は何ですか?

32
Joshua Merriman

textwrap モジュールを使用できます:

>>> import textwrap
>>> strs = "In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly."
>>> print(textwrap.fill(strs, 20))
In my project, I
have a bunch of
strings that are
read in from a file.
Most of them, when
printed in the
command console,
exceed 80 characters
in length and wrap
around, looking
ugly.

helpon textwrap.fill

>>> textwrap.fill?

Definition: textwrap.fill(text, width=70, **kwargs)
Docstring:
Fill a single paragraph of text, returning a new string.

Reformat the single paragraph in 'text' to fit in lines of no more
than 'width' columns, and return a new string containing the entire
wrapped paragraph.  As with wrap(), tabs are expanded and other
whitespace characters converted to space.  See TextWrapper class for
available keyword args to customize wrapping behaviour.

行を別の行にマージしたくない場合は、regexを使用します。

import re


strs = """In my project, I have a bunch of strings that are.
Read in from a file.
Most of them, when printed in the command console, exceed 80.
Characters in length and wrap around, looking ugly."""

print('\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', strs)))

# Reading a single line at once:
for x in strs.splitlines():
    print '\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', x))

output:

In my project, I have a bunch of strings
that are.
Read in from a file.
Most of them, when printed in the
command console, exceed 80.
Characters in length and wrap around,
looking ugly.
62

これが textwrap モジュールの目的です。 textwrap.fill(some_string, width=75)を試してください。

11
jwodder

これはAshwiniの答えに似ていますが、reを使用しません。

lim=75
for s in input_string.split("\n"):
    if s == "": print
    w=0 
    l = []
    for d in s.split():
        if w + len(d) + 1 <= lim:
            l.append(d)
            w += len(d) + 1 
        else:
            print " ".join(l)
            l = [d] 
            w = len(d)
    if (len(l)): print " ".join(l)

出力入力が質問の場合:

In my project, I have a bunch of strings that are read in from a file.
Most of them, when printed in the command console, exceed 80 characters in
length and wrap around, looking ugly.

I want to be able to have Python read the string, then test if it is over
75 characters in length. If it is, then split the string up into multiple
strings, then print one after the other on a new line. I also want it to be
smart, not cutting off full words. i.e. "The quick brown <newline> fox..."
instead of "the quick bro<newline>wn fox...".
4
perreal
string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)

def wrap(string, max_width):
    s=''
    for i in range(0,len(string),max_width):
        s=s+string[i:i+max_width]
        s=s+'\n'
    return s
0
pawan kumar