![](/img/trans.png)
[英]Python: Recursively split strings when longer than max allowed characters, by the last occurrence of a delimiter found before max allowed characters
[英]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.