2012-04-01 5 views
0

나는 최대 80 자 긴 줄만 인쇄하고 싶지만 그보다 짧고 길 수있는 s 줄이있다. 그래서 으로 나눠서 단어를 분리하지 않고 싶습니다. 긴 문자열의Python에서 단어로 분할하지 않고 (잠재적으로) 긴 문자열을 분할하는 좋은 방법이 있습니까?

예 :

sub_str_left = 0 
pos = 0 
next_pos = s.find(" ", pos) 
while next_pos > -1: 
    if next_pos - sub_str_left > 80: 
     print s[sub_str_left:pos-sub_str_left] 
     sub_str_left = pos + 1 

    pos = next_pos 
    next_pos = s.find(" ", pos) 

print s[sub_str_left:] 
:

words = s.split(" ") 
line = "" 
for w in words: 
    if len(line) + len(w) <= 80: 
     line += "%s " % w 
    else: 
     print line 
     line ="%s " % w 

print line 

가 마찬가지로 나는 잠시 루프에서 반복적으로 s.find(" ")을 사용할 수 있습니다 :이 같은 일을하는 방법을 고안 할 수

s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No mishaps no typos. No bugs. But I want the code too look good too. That's the problem!" 

이들 중 아무 것도 매우 우아하지 않으므로, 저의 질문은 더 시원한 파이썬 적 방법 이? (아마도 정규식 정도.)

+0

귀하의 질문에 내가 몇 일 전에 질문 질문과 유사이 파이썬 스크립트를 시도 할 수 있습니다. http://stackoverflow.com/questions/9894983/wrapping-a-text-file-so-that-each-line-contain-a-max-of-80-characters –

+0

나는 이전 게시물을 검색하는 것을 놓쳤다. _wraping_에 관해 이야기하는 동안 _splitting_을 찾고있는 나를 생각해보십시오. 그렇지만 그들은 비슷합니다. – deinonychusaur

+0

글쎄, 기술적으로 이것을 래핑이라고합니다. –

답변

13

해당하는 모듈있다 : textwrap

예를 들어, 당신은

print '\n'.join(textwrap.wrap(s, 80)) 

또는

print textwrap.fill(s, 80) 
2
import re 
re.findall('.{1,80}(?:\W|$)', s) 
+0

이것은 기본 단어 줄 바꿈 알고리즘과 비교할 때 좋지 않습니다. – delnan

+0

속도 측면이 아닙니다. 텍스트 랩에 대해 벤치마킹을 한 결과 약 50 배 빠릅니다. (n.b. 속도는 모든 것이 아니라 단지 재미있는 것임을 압니다.) – bluepnume

+0

속도가 (거의 - 당신은 요구 사항을 변경할 수 있습니다.) 기능이 부족한 경우에는 아무것도 아닙니다.) – delnan

2
import re 

s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No misshaps no typos. No bugs. But I want the code too look good too. That's the problem!" 

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

을 사용할 수 있습니다 개 넣어 :

This is a long string that is holding more than 80 characters and thus should be 
split into several lines. That is if everything is working properly and nicely 
and all that. No misshaps no typos. No bugs. But I want the code too look good 
too. That's the problem! 
0

당신은

import os, sys, re 
s = "This is a long string that is holding more than 80 characters and thus should be split into several lines. That is if everything is working properly and nicely and all that. No misshaps no typos. No bugs. But I want the code too look good too. That's the problem!" 
limit = 83 
n = int(len(s)/limit) 
b = 0 
j= 0 
for i in range(n+2): 

    while 1: 
     if s[limit - j] not in [" ","\t"]: 
      j = j+1 
     else: 
      limit = limit - j 
      break 
    st = s[b:i*limit] 
    print st 
    b = i*limit