繁体   English   中英

Python 在 x 字符前的最后一个点处拆分

[英]Python split at last dot before x characters

我有一个很长的字符串,想在 100 个字符之前的最后一个点处拆分该字符串。

例如,我有一个字符串(200 个字符),例如:

string = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor. invidunt ut labore et dolore mgna aliquyam erat. sed diam voluptua. At vero eos et accusam et justo duo dolores."

最后,我想要一个包含两个或更多完整句子的列表,最多 100 个字符。

str = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor. invidunt ut labore et dolore mgna aliquyam erat. sed diam voluptua. At vero eos et accusam et justo duo dolores."

n = 100
str = str.rstrip(".")
chunks = [str[i:i+n] + "." for i in range(0, len(str), n)]
print(chunks)

output:

['Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor. invidunt ut .', 'labore et dolore mgna aliquyam erat. sed diam voluptua. At vero eos et accusam et justo duo dolores.']

想要在 100 个字符之前的最后一个点处拆分该字符串

见下文

string = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor. invidunt ut labore et dolore mgna aliquyam erat. sed diam voluptua. At vero eos et accusam et justo duo dolores."
split_idx = string[:100].rfind('.')
final_string = string[:split_idx]
print(final_string)

output

Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor

您可以使用带有 finditer() 的正则表达式:

import re
s = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor. invidunt ut labore et dolore mgna aliquyam erat. sed diam voluptua. At vero eos et accusam et justo duo dolores."

r = [m.group().strip() for m in re.finditer(r' *((.{0,99})(\.|.$))',s)]

print(r)

['Lorem ipsum dolor sit amet, consetetur sadipscing elitr. sed diam nonumy eirmod tempor.',
 'invidunt ut labore et dolore mgna aliquyam erat. sed diam voluptua.',
 'At vero eos et accusam et justo duo dolores.']

print(*map(len,r)) # 87 67 44

r' *((.{0,99})(\.|.$))'表达式查找最多 99 个字符(.{0,99}) ,后跟句点或字符串的最后一个字符(\.|.$) 它还包括(但不计算)前导空格*以便可以从后续行中删除换行期之后的空格,而不会妨碍其长度限制。

请注意,这假设没有单个句子的字符数超过 100 个。 根据发生这种情况时您想要执行的操作,您可以相应地调整正则表达式。 例如,如果您想在 100 个字符后任意拆分: *((.{0,99})(\.|.$)|(.{100}))或尝试在单词之间拆分: *((.{0,99})(\.|.$)|(.{100})\b)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM