Есть хороший способ разделить (потенциально) длинную строку без разделения на слова в Python? - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу убедиться, что я печатаю не более 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 mishaps no typos. No bugs. But I want the code too look good too. That's the problem!"

Я могу придумать способы сделать это, например:

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(" ") итеративно в цикле while:

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:]

Ничто из этого не очень элегантно, поэтому мой вопрос в том, есть ли более холодный питонический способ сделатьэтот?(Может быть с регулярным выражением или около того.)

Ответы [ 4 ]

14 голосов
/ 02 апреля 2012

Для этого есть модуль: textwrap

Например, вы можете использовать

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

или

print textwrap.fill(s, 80)
2 голосов
/ 02 апреля 2012
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!
2 голосов
/ 02 апреля 2012
import re
re.findall('.{1,80}(?:\W|$)', s)
0 голосов
/ 23 января 2013

Вы можете попробовать этот скрипт Python

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