2016-03-17 58 views
2

假設1有文字的長塊(保存在記事本),長326個字符。使用Python段落裁減成線

Lorem存有胡蘿蔔,生態番茄湯。他實在是NIBH augue。但歐盟,也沒有仇恨,被帶來。沒有融資跑步的人非常柔軟的足球池。沒有沙拉沙拉是融資的作者,但開發商收到攝影笑容週末的湖泊和製造。 Suspendisse suscipit velit ID。

1想讓它這樣說:

Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. 
Nam et nibh augue. 
Sed dignissim eu odio nec efficitur. 
Nulla aliquam imperdiet ipsum, 
eu mollis lacus cursus quis. 
Nulla dictum sem sem in auctor erat imperdiet sed suscipit 
elit ut lacus vestibulum vitae consequat risus volutpat. 
Suspendisse suscipit velit id. 

希望它採取的步驟1:

  • 有一段時間,添加一個新行。

  • 如果有一個段落,添加一個新行。

  • 如果該行仍然太長(例如超過60個字符)在下一空間添加一個新行。

+1

看一看在Python模塊['re'(https://docs.python.org/2/library/re.html),特別是在['現實。 sub'](https://docs.python.org/2/library/re.html#re.sub)。 – morxa

+0

是的,也看到http://stackoverflow.com/questions/4427542/how-to-do-sed-like-text-replace-with-python – spiffman

+0

如果你想要做的是換行的長字符串到給定的寬度,標準庫中的['textwrap'模塊(https://docs.python.org/3/library/textwrap.html)會爲你做它。如果你有_exact_以滿足這些要求(家庭作業?),那麼你就必須創建自己的功能。 –

回答

2

這會給

s = """Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et nibh augue. Sed dignissim eu odio nec efficitur. Nulla aliquam imperdiet ipsum, eu mollis lacus cursus quis. Nulla dictum sem sem in auctor erat imperdiet sed suscipit elit ut lacus vestibulum vitae consequat risus volutpat. Suspendisse suscipit velit id.""" 
result = "\n".join(re.findall(r"(.{,59}?(?:,|\.)|.{58}\S*)\s*", s)) 
print(result) 

結果:

Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. 
Nam et nibh augue. 
Sed dignissim eu odio nec efficitur. 
Nulla aliquam imperdiet ipsum, 
eu mollis lacus cursus quis. 
Nulla dictum sem sem in auctor erat imperdiet sed suscipit 
elit ut lacus vestibulum vitae consequat risus volutpat. 
Suspendisse suscipit velit id. 

re解釋:

.{,59}?(?:,|\.)匹配任何,.在它之前有少於59個字符。 .{58}\S*匹配任何有超過58個字符,直到下一個單詞。 最後,\s*爲了修剪其關閉任何空的空間相匹配。

0

使用本地Python代碼將是使用replace對於第一種情況中的溶液,然後後自動換行。通過re使用正則表達式可能是更有效的,但是這是遠遠更具可讀性任何人試圖理解你的代碼。它也更長,1不,如果你關心的是知道的。總之,這裏是我的解決方案:

def wordwrap(text, limit=60): 
    """Just a function to wrap words to line length 60.""" 
    words = text.split(" ") 
    lines_out = [words[0]] 
    for word in words[1:]: 
     last_line = lines_out[-1] 
     if len(last_line)+len(word) > limit: 
      lines_out.append(word) 
     else: 
      lines_out[-1] = last_line+" "+word 
    return "\n".join(lines_out) 


def process(int): 
    """Process your input to follow all you rules""" 
    # Add newlines after commas and periods 
    inp = inp.replace(".", ".\n").replace(",", ",\n") 

    lines = inp.split("\n") 
    lines = [l.strip() for l in lines] # Remove any spaces before lines 

    # Wrap remaining lines 
    lines = [wordwrap(l) for l in lines] 
    return "\n".join(lines) 

# A test. 
if __name__ == "__main__": 
    text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et nibh augue. Sed dignissim eu odio nec efficitur. Nulla aliquam imperdiet ipsum, eu mollis lacus cursus quis. Nulla dictum sem sem in auctor erat imperdiet sed suscipit elit ut lacus vestibulum vitae consequat risus volutpat. Suspendisse suscipit velit id." 
    print process(text)