【问题标题】:Python split at last dot before x charactersPython 在 x 个字符之前的最后一个点处拆分
【发布时间】:2021-06-08 08:27:49
【问题描述】:

我有一个很长的字符串,想在 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 个字符。

【问题讨论】:

标签: python split


【解决方案1】:
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)

输出:

['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.']

【讨论】:

  • 您真的想在句子(或单词)中间打断并添加一个不存在的句点吗?例如`invidunt ut .`
【解决方案2】:

想要在 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)

输出

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

【讨论】:

    【解决方案3】:

    你可以在 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)

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2011-07-09
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多