You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中如何基于带句号的数字正确分割文本?

问题分析

你之前用的re.split('([0\.-9\.]+)', text)写法有问题:这个正则里的字符类[0\.-9\.]会匹配单个数字、小数点或减号,而不是你想要的「数字+句号」组合,所以才会把数字单独分割出来,达不到预期效果。

最巧妙的解决方法

方法1:用re.split匹配正确的分隔符

直接以「数字+句号(前后可能带空格)」作为分隔符分割文本,就能直接得到你想要的列表,代码简洁到离谱:

import re

text = "2 of 5 deliveries some text some text... 1. 3 of 5 items some text some text... 2. 1 of 5 items found in box some text..."
result = re.split(r'\s*\d+\.\s', text)

print(result)
# 输出:
# ['2 of 5 deliveries some text some text...', '3 of 5 items some text some text...', '1 of 5 items found in box some text...']
正则细节解释:
  • \s*:匹配0个或多个空格,处理分隔符前后可能存在的空格
  • \d+:匹配1个或多个数字(支持多位数,比如10.也能匹配)
  • \.:转义后的句号,避免被正则当作通配符
  • \s:匹配一个空格,确保分割后段落开头没有多余空格

方法2:用re.findall直接提取段落

如果你更习惯「提取」而非「分割」,可以用正则精准匹配所有目标段落,包括开头没有「数字.」前缀的部分:

import re

text = "2 of 5 deliveries some text some text... 1. 3 of 5 items some text some text... 2. 1 of 5 items found in box some text..."
pattern = r'(?:^\d+ of \d+.*?)(?=\s+\d\.|$)|(?:(?<=\s\d\.)\s+.+?(?=\s+\d\.|$))'
result = [part.strip() for part in re.findall(pattern, text)]

print(result)
# 输出和方法1完全一致
正则细节解释:
  • 第一部分(?:^\d+ of \d+.*?)(?=\s+\d\.|$):匹配开头的段落,以「数字 of 数字」开头,直到遇到下一个「空格+数字.」或文本结尾(用正向预查确保不包含分隔符)
  • 第二部分(?:(?<=\s\d\.)\s+.+?(?=\s+\d\.|$)):匹配「数字.」后面的段落,用反向预查确保前面是合法分隔符,然后匹配内容直到下一个分隔符或结尾

毫无疑问,方法1是最简洁巧妙的,完全贴合你的需求,代码易读且高效。

内容的提问来源于stack exchange,提问作者EchoCache

火山引擎 最新活动