用长字符串中的新行替换空格以“换行”

Posted

技术标签:

【中文标题】用长字符串中的新行替换空格以“换行”【英文标题】:Replacing a space with a new line in a long string in order to "wrap a text" 【发布时间】:2022-01-22 16:09:41 【问题描述】:

我需要在 seaborn 图中使用长字符串作为标签。如果我使用长字符串,则有效绘图区域会减少,所以我想换行,见下文:

我想做的是取一个长字符串,例如:

'Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。'

并且每个n 字符(例如30)找到一个空格并将其替换为换行符“\n”。所以我得到了

'Lorem ipsum dolor sit amet, consectetur\nadipiscing elit, sed do eiusmod\ntempor incididunt ut labore et\ndolore magna aliqua。'`

我已经设法创建了一个递归函数

def string_for_plot(raw_str:str, n:int = 30):
    a_indx = raw_str.find(' ',n)
    if a_indx>0:           
        return raw_str[:a_indx]+'\n' + string_for_plot (raw_str[a_indx+1:], n=n)            
    elif a_indx == -1:
       return raw_str

这很好用,但我想知道是否可以使用更有效的方法/更 Python 的方式来执行此操作(例如,正则表达式,我不知道的其他一些字符串函数)。

【问题讨论】:

您可能想从标准库中签出textwrap。 这看起来很有希望。 您的代码将生成超过 30 个字符的行。当然,您需要的是生成不超过 30 个字符的行 @jCaesar 你说得对(虽然我可以很容易地调整它以选择最接近 30 个字符),我只是想知道是否还有另一种更有效的方法,例如比如textwrap。这更多是为了扩展我的知识,而不是急于找到解决方案。 当有标准模块可以满足您的需求时,“重新发明***”几乎没有任何意义。 textwrap 中的 wrap() 非常适合这个用例 【参考方案1】:

我自己的方法如下:

遍历单词,只要单词适合行(不超过最大长度),就将单词添加到行中。

但如果该行太长,请将单词添加到下一行。

请注意,第一行中的第一个单词前面有一个空格(因为我们每次都添加一个空格,然后将单词添加到行中),因此我们必须返回行而不是第一个字符。

完整代码:

def split(input_line, max_length):
    lines = []
    cur_line = ""
    for word in input_line.split():
        if len(cur_line) + len(word) > max_length:
            lines.append(cur_line)
            cur_line = word
        else:
            cur_line += " " + word
    return "\n".join(lines)[1:]

【讨论】:

或者你可以使用文本换行模块中的 wrap() 函数

以上是关于用长字符串中的新行替换空格以“换行”的主要内容,如果未能解决你的问题,请参考以下文章

shell 如何将空格替换成;

Java 中的空格符、换行符等怎么表示

把记事本里所有的空格替换为换行怎么弄的?

如何使用 C# 在给定文本中用忽略空格、回车或换行符替换字符串

在 PHP 中用一个空格替换多个空格和换行符

求助sed命令匹配并替换无效的换行符