2017-12-25 2 views
-3

私はこの文字列を持っている:Pythonでは、文字を一定数の文字に再帰的に折り返す方法は何ですか?

text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz" 

私は文字幅にそれをラップしたい(例:5)それは、このなるように:

abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 
abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 

非再帰的に、ここで私が持っているものです。

text_in = text.split("\n") 
text_out = [] 

width = 5 
for line in text_in: 
    if len(line) < width: 
     text_out.append(line) 
    else: 
     text_out.append(line[:width]) 
     text_out.append(line[width:]) 

print("\n".join(text_out)) 

だから、それは右のみ有数オーダーレベルに物事を取得します。

abc d 
ef ghi jkl mno pqr stu vwx yz 
abc d 
ef ghi jkl mno pqr stu vwx yz 

どのようにこのラッピングは、再帰的または他のいくつかのきちんとした方法で行う必要がありますか?

答えて

0

正規表現溶液:

import re 

def wrap_text(text, width): 
    if not width: 
     return text 
    else: 
     return re.sub(r'(.{' + str(width) + '})', '\\1\n', text) 

text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz" 

  • (.{<width>})から(...)

1括弧グループに文字の各<width>数をキャプチャテストケース#1:

print(wrap_text(text, 5)) 

出力:

abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 
abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 

テストケース#2:

print(wrap_text(text, 10)) 

出力:

abc def gh 
i jkl mno 
pqr stu vw 
x yz 
abc def gh 
i jkl mno 
pqr stu vw 
x yz 
+1

正規表現は少し過剰ですか? – everyone

1

iはリスト内包でこれを行うだろう。

text = text.replace("\n", " ") 

やリストの内包後:

text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz" 

res = [text[pos:pos+5] for pos in range(0, len(text), 5)] 

for i in res: 
    print(i) 

を使用して、追加の空白で改行を置き換えることができ改行文字を処理するために

for i in res: 
    if '\n' in i: 
     i = i.strip('\n') 
     print(i) 
    else: 
     print(i) 

結果は以下のようになります。

abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 
abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 
+0

これはクールです、ありがとう。 1つのことtho:あなたは既存の改行を尊重する方法を知っていますか?同様に、改行があった場合は改行を開始する必要があります。 – BlandCorporation

+0

私はそれを今編集しました、私はあなたが正しい方法であなたを理解してくれることを願っています。 – bierschi

-1

一つは、部分文字列を取得するためにforループを使用することができます。

text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz" 
llen = len(text);  lst = [];  stemp = "" 
for i in range(llen): 
    if i % 5 == 0 and i>0: 
     lst.append(stemp) 
     stemp = "" 
     stemp += text[i] 
    else: 
     stemp += text[i] 

for ll in lst: 
    print(ll) 

出力:textwrap.wrapを使用するようにダニエルローズマンの提案に何が起こった

abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
x yz 

abc d 
ef gh 
i jkl 
mno 
pqr s 
tu vw 
+1

否定的な有権者がここにコメントを書くことができれば便利です。 – rnso

1

?完了のためだけに、それが消えたので:

import textwrap 

a = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz" 

for item in textwrap.wrap(a, 5): 
    print(item) 
関連する問題