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

Python中如何处理重叠关键词的括号标注问题?

解决关键词重叠匹配时的嵌套括号问题

问题背景

我有一个包含重叠关键词的列表,需要将输入字符串中的这些关键词用[]包裹:

keywords = ["alpha", "alpha beta", "alpha beta charlie", "alpha beta charlie delta"]

已按关键词长度降序排序,优先匹配长关键词,但运行代码后出现了错误的嵌套/拆分括号:

  • 期望输出:[alpha] [alpha beta] [alpha beta charlie] [alpha beta charlie delta]
  • 实际输出:[alpha] [alpha] beta] [alpha] beta] charlie] [alpha] beta] charlie] delta]

原代码

import re

keywords = ["alpha", "alpha beta", "alpha beta charlie", "alpha beta charlie delta"]

keywords.sort(key=len, reverse=True)

section = "alpha alpha beta alpha beta charlie alpha beta charlie delta"
section = section.replace("'", "’").replace("\"", "”")
section_lines = section.split('\n')
for i, line in enumerate(section_lines):
    if not line.startswith('#'):
        section_lines[i] = re.sub(r'-',' ',line)
        for x in range(4):
            section_lines[i] = re.sub(r'\b' + f"{keywords[x]}" + r'\b', f"[{keywords[x]}]", section_lines[i], flags=re.IGNORECASE)
            section_lines[i] = section_lines[i].replace("[[", "[").replace("]]", "]")

section = '\n'.join(section_lines)
section = section.replace("   "," ").replace("  "," ")

print(section)

问题原因

循环多次调用re.sub会导致已被包裹的内容被重复匹配。比如匹配完[alpha beta charlie delta]后,后续循环中的alpha还会匹配括号内的alpha,进而产生错误的拆分或嵌套,而简单替换[[/]]无法解决这类拆分式的错误。

修正方案

将所有关键词拼接成一个正则模式,利用正则分支匹配的优先级(先匹配长关键词),一次性完成所有替换,避免重复处理已匹配的内容:

import re

keywords = ["alpha", "alpha beta", "alpha beta charlie", "alpha beta charlie delta"]
# 按长度降序排序,确保长关键词优先被匹配
keywords.sort(key=lambda x: len(x), reverse=True)

# 转义关键词中的正则特殊字符,拼接成|分隔的正则模式,保留整词匹配规则
pattern = r'\b(' + '|'.join(re.escape(kw) for kw in keywords) + r')\b'

section = "alpha alpha beta alpha beta charlie alpha beta charlie delta"
section = section.replace("'", "’").replace("\"", "”")
section_lines = section.split('\n')

for i, line in enumerate(section_lines):
    if not line.startswith('#'):
        line = re.sub(r'-', ' ', line)
        # 一次性完成所有替换,正则引擎会优先匹配长关键词,且不会重复匹配已替换内容
        line = re.sub(pattern, r'[\1]', line, flags=re.IGNORECASE)
        section_lines[i] = line

# 用正则批量替换多个空格为单个空格,更简洁高效
section = '\n'.join(section_lines)
section = re.sub(r'\s+', ' ', section)

print(section)

关键优化点

  1. re.escape处理关键词:避免关键词中包含正则特殊字符(如.、*)导致匹配异常
  2. 单模式一次性替换:避免循环多次替换带来的重复匹配问题,正则分支会按顺序优先匹配更长的关键词
  3. 简化空格处理:用re.sub(r'\s+', ' ', section)替代多次replace,更高效处理任意数量的连续空格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:25