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

Python维基百科链接解析:正则表达式匹配规则优化需求

解决方案建议

两种可行思路:直接正则断言或先清理文本

思路1:改进正则表达式,用负向断言排除引用块

针对你的需求,需要调整正则同时支持[[:Category:...]]和[[...]]格式,并排除* {{ ... }}块内的链接。可以使用负向环视断言实现:

(?<!\* {{[^}\n]*)\[\[:?([^|\]]+)(?:\|[^|\]]+)?\]\](?![^}\n]*}})

正则解释:

  • (?<!\* {{[^}\n]*):负向后瞻,确保当前[[/[[:前面没有* {{开头且未到换行/}}的内容
  • \[\[:?:匹配维基百科的两种链接前缀[[或[[:
  • ([^|\]]+):核心捕获组,提取|和]之前的目标内容(对应你要的:Category:Anarchism by country、Squatting等)
  • (?:\|[^|\]]+)?:可选匹配链接的显示文本部分(比如|squat)
  • (?![^}\n]*}}):负向前瞻,确保当前]]后面没有换行/}}之前的内容,避免匹配引用块内的链接

如果需要处理跨多行的引用块,加上re.DOTALL flag,并把[^}\n]换成[^}]:

(?s)(?<!\* {{.*?)\[\[:?([^|\]]+)(?:\|[^|\]]+)?\]\](?!.*?}})

思路2:先清理引用块再匹配链接(更可靠)

复杂正则容易受嵌套、跨多行等场景影响,更简单的方式是先移除所有* {{ ... }}引用块,再用你原本的正则(稍作调整支持分类链接)匹配:

import re

wiki_text = "你的维基百科文本内容"
# 第一步:移除所有* {{开头的引用块
cleaned_text = re.sub(r'\* {{.*?}}', '', wiki_text, flags=re.DOTALL)
# 第二步:匹配所有目标链接
pattern = r'\[\[:?([^|\]]+)(?:\|[^|\]]+)?\]\]'
matches = re.findall(pattern, cleaned_text)

这种方法逻辑清晰,避免了正则断言的复杂边界问题,适合处理维基百科的复杂文本结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:55:30