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

使用Python正则提取不同格式章节引用的技术问询

解决多格式章节引用提取的Python正则方案

我明白你现在需要处理的章节引用格式真的挺多样的——既有英文的Section/Sections带数字和子项的情况,也有中文“第X章节的(X)项”这种格式,之前的代码只能处理简单场景还出了连写错误,下面给你一套能覆盖所有需求的完整解决方案:

第一步:先理清楚所有要匹配的目标模式

咱们得先把要抓的引用类型列全:

  • 英文单章节:Section 23
  • 英文带子项的单章节:Section 45(3)
  • 英文多章节列表:Sections 21(1), 54(2), 78(1)
  • 中文带子项的章节:第75章节的(e)项

第二步:编写适配全格式的正则表达式

我做了两个版本的正则,你可以根据自己的文档情况选:

英文引用专用正则

专门处理Section/Sections开头的引用,完美支持单/多章节、带/不带子项:

english_section_regex = r'(Sections?)\s+((?:\d+(?:\(\w+\))?(?:,\s*)?)+)'

拆解一下每个部分的作用:

  • Sections?:匹配Section或者Sections?表示末尾的s可选)
  • \s+:强制匹配一个或多个空格,彻底解决你之前遇到的Section 231连写错误
  • (?:\d+(?:\(\w+\))?(?:,\s*)?)+:匹配一个或多个章节项,每个项的结构是:
    • \d+:匹配章节的数字部分
    • (?:\(\w+\))?:可选的子项(比如(3)(a)\w+能匹配字母或数字)
    • (?:,\s*)?:可选的逗号加空格,用来分隔多个章节

中英通用匹配正则

如果需要同时抓中文和英文引用,直接用这个综合版:

universal_section_regex = r'(Sections?\s+\d+(?:\(\w+\))?(?:,\s*\d+(?:\(\w+\))?)*|第\d+章节的\(\w+\)项)'

这个正则用|把英文和中文的匹配分支分开,各自对应不同的格式。

第三步:Python代码实现与测试示例

下面是完整的可运行代码,包含提取、格式化输出的逻辑:

import re

def extract_section_references(text):
    # 用中英通用正则,开启忽略大小写模式(兼容Section/section的写法)
    regex = r'(Sections?\s+\d+(?:\(\w+\))?(?:,\s*\d+(?:\(\w+\))?)*|第\d+章节的\(\w+\)项)'
    matches = re.findall(regex, text, flags=re.IGNORECASE)
    # 过滤掉空结果,返回整理后的列表
    return [match.strip() for match in matches if match.strip()]

# 测试用的示例文本,模拟你的文档内容
sample_text = """
需要提取的引用示例:
1) Section 23
2) Section 45(3)
3) 第75章节的(e)项
4) Sections 21(1), 54(2), 78(1)
还有混合场景:比如Section 10(a)和第30章节的(2)项
"""

# 执行提取并打印结果
references = extract_section_references(sample_text)
print("提取到的章节引用:")
for ref in references:
    print(f"- {ref}")

代码运行结果:

提取到的章节引用:
- Section 23
- Section 45(3)
- 第75章节的(e)项
- Sections 21(1), 54(2), 78(1)
- Section 10(a)
- 第30章节的(2)项

第四步:针对特殊格式的扩展优化

如果你的文档还有其他变种格式,比如英文的Sec. 23缩写、中文的“第X条第Y项”,可以直接扩展正则的匹配分支:

  • 支持英文缩写:把Sections?改成(Sections?|Sec\.?)
  • 支持中文“第X条第Y项”:在正则里增加分支第\d+条第\(\w+\)项

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

火山引擎 最新活动