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
相关产品推荐
相关产品推荐

