如何用负向前瞻/后顾正则避免Markdown关键词重复包裹[[ ]]?
问题分析与解决方案
当前方案的问题
- 单词边界
\b的局限:当关键词前后是-、&这类非单词字符时,\b会错误识别为单词边界,导致匹配到[[...]]内部的关键词(比如ipsum-FOO&dolor里的FOO)。 - 块范围检查缺失:原正则仅判断关键词紧邻的前后不是
[[/]],但对于[[ipsum FOO dolor]]这种块内的关键词,因为前面是空格而非[[,会被错误匹配。
修正后的正则与代码
要确保关键词不在任何[[ ... ]]块内部,同时避免重复包裹,可使用以下正则和代码:
import re def wrap_terms_in_markdown(file_content, term_list): for term in term_list: # 核心正则:排除 [[ ... ]] 块内的关键词 pattern = r'(?<!\[[^\]]*)({})(?![^\[]*\])'.format(re.escape(term)) file_content = re.sub(pattern, r'[[\1]]', file_content) return file_content
正则解释
(?<!\[[^\]]*):负向后行断言,检查关键词前不存在[[开头且未闭合的内容,直接排除块内的关键词。({}):捕获目标关键词,用re.escape转义特殊字符,避免正则语法冲突。(?![^\[]*\]):负向前行断言,检查关键词后不存在未闭合的]]结尾内容,进一步确保不在块内。
测试验证
所有测试用例均符合预期:
- ✅ 匹配:
lorem ipsum FOO dolor→lorem ipsum [[FOO]] dolor - ✅ 不匹配:
lorem ipsum [[FOO]] dolor - ✅ 不匹配:
lorem [[ipsum FOO dolor]] sit amet - ✅ 不匹配:
lorem [[ipsumFOOsolor]] sit amet - ✅ 不匹配:
[[lorem]] [[ipsum-FOO&dolor-sit.pdf#page=130]]
内容的提问来源于stack exchange,提问作者A. Ocannaille
相关产品推荐
相关产品推荐

