如何用Python提取以[1]、(1.1)等带括号编号开头的段落?
问题需求
需要用Python提取以[1]、[1.1]、(2)、(1.2)这类带层级结构的括号编号开头,且到下一个同类型编号结束的段落。现有代码仅支持单个数字的[]/()编号,无法处理层级编号,且正则匹配逻辑存在问题。
现有代码的问题
- 正则表达式错误:
re.compile("\[\d\]") or re.compile("\(\d\)")这种写法不会同时匹配两种括号,第二个compile结果会被忽略,而且仅匹配单个数字,不支持1.1这类层级编号。 - 编号连续性判断逻辑错误:
int(current)-int(prev) ==1只适用于整数编号,无法处理带小数点的层级编号(比如1之后接1.1是合法段落开头,但该逻辑会过滤掉这类情况)。
改进方案
下面是修正后的代码,支持两种括号的层级编号匹配,并正确分割段落:
import re def extract_numbered_paragraphs(text): # 匹配[数字]、(数字)、[1.1]、(2.3.4)这类层级编号 pattern = re.compile(r'(\[|\()\d+(\.\d+)*(\]|\))') # 获取所有匹配的起始位置和匹配内容 matches = list(pattern.finditer(text)) if not matches: return [] paragraphs = [] # 遍历所有匹配项,分割段落 for i in range(len(matches)): start_idx = matches[i].start() if i < len(matches) - 1: end_idx = matches[i+1].start() paragraph = text[start_idx:end_idx].strip() else: # 最后一段到文本末尾 paragraph = text[start_idx:].strip() paragraphs.append(paragraph) return paragraphs # 测试示例 test_text = """[1] 这是第一个段落的内容,包含多行 或者换行的情况。 [1.1] 这是第一个段落的子层级内容,属于[1]的下级。 (2) 这是第二种括号开头的段落,测试不同括号类型。 (2.1) 这是(2)的子层级,验证层级编号的提取。""" result = extract_numbered_paragraphs(test_text) for idx, para in enumerate(result, 1): print(f"--------段落 {idx}--------------") print(para)
代码说明
- 正则表达式:
r'(\[|\()\d+(\.\d+)*(\]|\))'(\[|\():匹配开头的[或(\d+(\.\d+)*:匹配数字开头,后面可跟任意多个.数字(比如1、1.1、2.3.5都能匹配)(\]|\)):匹配结尾的]或)
- 段落分割:通过获取所有匹配的起始位置,将文本按相邻两个匹配的位置分割,最后一段直接取到文本末尾,确保每个段落都是从当前编号开头到下一个编号开头前的内容。
- 兼容性:不管编号是整数还是层级结构,不管是方括号还是圆括号,都能正确匹配和分割。
内容的提问来源于stack exchange,提问作者hellowworld123
相关产品推荐
相关产品推荐

