如何匹配连续换行符( / )以获取文本分割偏移量?
问题:正确匹配连续换行符并获取文本段偏移量
输入文本
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,}'存在两个致命问题:
- 使用
[]字符类后,里面的\r\n | \n\n会被拆分为单个字符匹配,相当于匹配\r、\n、空格、|中的任意字符,且要求出现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)
关键说明
- 正则表达式
r'(?:\r?\n){2,}':(?:...)是非捕获分组,将\r?\n作为一个整体重复匹配\r?\n兼容匹配Windows的\r\n和Linux的\n格式的单个换行{2,}要求该换行序列至少出现2次,即连续至少两个换行(不管是\n\n还是\r\n\r\n)
- 代码逻辑:遍历所有匹配到的连续换行分隔符,记录每个文本段的起始索引到分隔符的起始索引;更新起始索引为分隔符的结束索引,最后处理剩余的最后一段文本。
运行结果
执行后会得到期望的输出:
[(0, 36), (40, 128)]
内容的提问来源于stack exchange,提问作者palash
相关产品推荐
相关产品推荐

