将字符串分割成最大大小的块,在换行处停止



我目前正在研究一个不和谐机器人的功能,该功能允许用户抓取当前播放歌曲的歌词。遗憾的是,discord对每个嵌入的最大限制为1024个字符,因此含有大量歌词的歌曲会被截断/抛出错误。

为了避免这种情况,我尝试将歌词分成单独的页面,每页使用200个单词。(显然,这仍然有长单词的错误空间,只是没有真正优化这个用例)

def create_embed(lyrics, song):
words = re.findall(r"S+|n", lyrics)
num_pages = (len(words) // 200) + 1
n = 200
pages = [" ".join(words[i:i + n]) for i in range(0, len(words), n)]

这样做的问题是,因为我在歌词中使用了这种方法,所以文本会在非常尴尬的位置分开,比如在句子的中间,使其难以阅读。

我要做的是将n = 200设置为搜索下一个换行符的最大范围。比如我有这样的文本:

阴影笼罩着我的心n我让月亮变黑n

我有n = 10剩下

阴影笼罩着我的心n我黑暗了

但是我想让它停在这个字符串的最后一个换行符处,意思是:

阴影笼罩着我的心n

实现这样的东西最简单的方法是什么?我是否需要使用负步长for_loop进行搜索?这似乎是一种相当强迫的方法。

所以我在一段时间前重新审视了这个问题,这是我最终想到的,虽然可能有一个更快/更简单的方法,但我仍然想分享如果其他人有这个问题。

start_idx = 0
length = 1023
end_idx = 0
while end_idx < len(lyrics):
print(f"end_idx:{end_idx} | len{len(lyrics)}")
end_idx = lyrics.rfind("n", start_idx, length + start_idx) + 1
print(lyrics[start_idx:end_idx])
start_idx = end_idx

基本上,它循环遍历长度为1023的文本块,并找到最后出现的"n"using python.rfind(),然后算法将其用作start_idx.

只要确保你有"n"如果附加在末尾,则循环将永远不会结束,因为它总是搜索下一个换行符,只要end_idx小于字符串的长度。

最新更新