You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配连续换行符( / )以获取文本分割偏移量?

问题:正确匹配连续换行符并获取文本段偏移量

输入文本

input_text = 'DOCKET NO.  10-10 851	)	DATE
	)
	)

On appeal from the
Department of Veterans Affairs Regional Office in Portland, Oregon
'

需求

基于正则表达式分割连续的\r\n或\n(如\r\n\r\n、\n\n等),获取分割后各段文本的起始和结束索引偏移量。

已尝试代码

s,e = 0,0
newline_offsets = []
for m in re.finditer(r'[\r\n | \n\n]{2,}', input_text,re.VERBOSE):    
    b1 = m.start()
    b2 = m.end()
    e= b1
    newline_offsets.append((s,e))
    s= b2
len_text = len(input_text)
if s != len_text:
    newline_offsets.append((s,len_text))

当前输出

newline_offsets
Out[52]: [(0, 10), (12, 28), (30, 32), (34, 36), (40, 58), (60, 126)]

期望输出

[(0, 36), (40, 128)]

问题原因

当前正则表达式r'[\r\n | \n\n]{2,}'存在两个致命问题:

  1. 使用[]字符类后,里面的\r\n | \n\n会被拆分为单个字符匹配,相当于匹配\r、\n、空格、|中的任意字符,且要求出现2次以上,这会把单个换行符之间的内容误判为分隔段。
  2. re.VERBOSE模式会忽略正则中的空格,同时字符类里的|失去逻辑或的作用,变成普通字符,完全偏离了匹配连续换行的初衷。

解决方案

修正后的代码

import re

input_text = 'DOCKET NO.  10-10 851	)	DATE\n	)\n	)\n\nOn appeal from the\nDepartment of Veterans Affairs Regional Office in Portland, Oregon\n'

s = 0
newline_offsets = []
# 匹配连续2次及以上的换行序列(兼容Windows和Linux换行格式)
for m in re.finditer(r'(?:\r?\n){2,}', input_text):
    b1 = m.start()
    newline_offsets.append((s, b1))
    s = m.end()
# 处理最后一段未被分割的文本
if s < len(input_text):
    newline_offsets.append((s, len(input_text)))

print(newline_offsets)

关键说明

  1. 正则表达式r'(?:\r?\n){2,}':
    • (?:...)是非捕获分组,将\r?\n作为一个整体重复匹配
    • \r?\n兼容匹配Windows的\r\n和Linux的\n格式的单个换行
    • {2,}要求该换行序列至少出现2次,即连续至少两个换行(不管是\n\n还是\r\n\r\n)
  2. 代码逻辑:遍历所有匹配到的连续换行分隔符,记录每个文本段的起始索引到分隔符的起始索引;更新起始索引为分隔符的结束索引,最后处理剩余的最后一段文本。

运行结果

执行后会得到期望的输出:

[(0, 36), (40, 128)]

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:20:05