在Python中,有没有办法在字符串的每68个字符中插入换行符和空格?

In Python, is there a way to insert a line break and spaces every 68 characters of a string?

我正在阅读描述并将它们转换为 python 中的字符串。由于过时的标准,每行的长度不得超过 80 个字符。前 12 个是 ';'后跟11个空格,最后68个应该是字符串。

我们有超过300个字符的字符串,所以我需要每68个字符插入一个'\n;'和11个空格。我们也有已经包含需要维护的 '\n' 的字符串。另外,如果单词不被打断,那将是首选。

这在 python 中可行吗?

我曾尝试这样做,但没有成功。

def badChars(stri):
    p=0
    if len(stri) > 68:
        for i in range(0, len(stri)):
            if stri[i] == "\" and stri[i+1] == "n":
                p=-1
            if p > 68:
                stri[i] = stri[i] + "\n;                 "
                p=-1
            p=p+1  

我需要文字保持完整,当前的 \n 保持不变。

您可以使用 textwrap module; 换行;您也可以指定要使用的缩进:

import textwrap

indentation = ';' + ' ' * 11
result = textwrap.fill(
    input_text, width=80,
    initial_indent=indentation, subsequent_indent=indentation)

如果您需要维护现有的换行符,首先拆分这些换行符,对每行应用换行,然后重新加入换行符:

indentation = ';' + ' ' * 11
params = {
    'width': 80,
    'initial_indent': indentation,
    'subsequent_indent': indentation
}
result = '\n'.join([textwrap.fill(line, **params)
                    for line in input_text.splitlines()])

str.splitlines() method 是最简单的通过行分隔符分割行的方法。

演示:

>>> import textwrap
>>> input_text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
>>> indentation = ';' + ' ' * 11
>>> result = textwrap.fill(
...     input_text, width=80,
...     initial_indent=indentation, subsequent_indent=indentation)
>>> print result
;           Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
;           eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
;           ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
;           aliquip ex ea commodo consequat. Duis aute irure dolor in
;           reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
;           pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
;           culpa qui officia deserunt mollit anim id est laborum.
>>>
>>> # produce a sample with newlines by inserting these around 170 characters
... 
>>> input_text = textwrap.fill(input_text, width=170)
>>> print input_text
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
>>> params = {
...     'width': 80,
...     'initial_indent': indentation,
...     'subsequent_indent': indentation
... }
>>> result = '\n'.join([textwrap.fill(line, **params)
...                     for line in input_text.splitlines()])
>>> print result
;           Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
;           eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
;           ad minim veniam, quis nostrud
;           exercitation ullamco laboris nisi ut aliquip ex ea commodo
;           consequat. Duis aute irure dolor in reprehenderit in voluptate velit
;           esse cillum dolore eu fugiat nulla
;           pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
;           culpa qui officia deserunt mollit anim id est laborum.

指定的宽度包括缩进。请注意,它将使用空格在整个单词处换行。有关控制换行方式的更多选项,请参阅模块文档。