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

Python正则提取MediaWiki表格行时遗漏行的问题解决

解决正则提取MediaWiki表格行时遗漏中间行的问题

要提取MediaWiki格式表格中以|-标识的行,但当前正则表达式会跳过一行,导致匹配结果遗漏中间元素。

原代码

import re

text = '|-
|[[Phantom Zone#Pre-Crisis|Xadu, Doctor]]
|
|[[DC Comics]]
|[[Adventure Comics]], Vol. 1, #283
|1961
|April
|[[Robert Bernstein (comics)|Robert Bernstein]]
|[[George Papp]]
|-
|[[Empire (comics)#Characters|Xanna]]
|
|[[Gorilla Comics]]/[[DC Comics]]
|[[Empire (comics)|Empire]], Vol. 1, #1
|2000
|May
|[[Mark Waid]]
|[[Barry Kitson]]
|-
|[[Sparta of Synriannaq#Character history|Xanthi]]
|
|[[DC Comics]]
|[[Teen Titans#The New Teen Titans (1980–1996)|New Titans]], Vol. 1, #51
|1989
|January
|[[Marv Wolfman]] and [[George Pérez]]
|[[George Pérez]]
|-
|[[Xardo (Action Comics 325)|Xardo]]
|
|[[DC Comics]]
|[[Action Comics]], Vol. 1, #325
|1965
|June
|
|[[Curt Swan]]
|-
|[[Xasnu (Action Comics 278)|Xasnu]]
|
|[[DC Comics]]
|[[Action Comics]], Vol. 1, #278
|1961
|July
|[[Jerry Coleman (comics)|Jerry Coleman]]
|[[Curt Swan]]
'

ROWS = re.findall(r"\|-(.*?)\|-", text, re.S)

当前错误结果

>>> ROWS
['\n|[[Phantom Zone#Pre-Crisis|Xadu, Doctor]]\n|\n|[[DC Comics]]\n|[[Adventure Comics]], Vol. 1, #283\n|1961\n|April\n|[[Robert Bernstein (comics)|Robert Bernstein]]\n|[[George Papp]]\n',
 '\n|[[Sparta of Synriannaq#Character history|Xanthi]]\n|\n|[[DC Comics]]\n|[[Teen Titans#The New Teen Titans (1980–1996)|New Titans]], Vol. 1, #51\n|1989\n|January\n|[[Marv Wolfman]] and [[George Pérez]]\n|[[George Pérez]]\n']

期望结果

>>> ROWS
['\n|[[Phantom Zone#Pre-Crisis|Xadu, Doctor]]\n|\n|[[DC Comics]]\n|[[Adventure Comics]], Vol. 1, #283\n|1961\n|April\n|[[Robert Bernstein (comics)|Robert Bernstein]]\n|[[George Papp]]\n',
'\n|[[Empire (comics)#Characters|Xanna]]\n|\n|[[Gorilla Comics]]/[[DC Comics]]\n|[[Empire (comics)|Empire]], Vol. 1, #1\n|2000\n|May\n|[[Mark Waid]]\n|[[Barry Kitson]]\n',
 '\n|[[Sparta of Synriannaq#Character history|Xanthi]]\n|\n|[[DC Comics]]\n|[[Teen Titans#The New Teen Titans (1980–1996)|New Titans]], Vol. 1, #51\n|1989\n|January\n|[[Marv Wolfman]] and [[George Pérez]]\n|[[George Pérez]]\n']

问题原因

原正则r"\|-(.*?)\|-"会消耗掉每个匹配末尾的|-,导致下一次匹配从这个|-之后开始,跳过了中间的行。比如第一个匹配消耗了第一行末尾的|-,下一次匹配就从第二行内容之后的|-开始,直接匹配第三行,遗漏了第二行。

解决办法

方法1:使用正向预查(不消耗分隔符)

修改正则表达式,用正向预查(?=\|-|$)匹配结束位置,这样|-不会被消耗,后续匹配可以继续使用它:

ROWS = re.findall(r"\|-(.*?)(?=\|-|$)", text, re.S)
# 取前三行目标内容
ROWS = ROWS[:3]

运行后即可得到完整的行列表,再通过切片获取需要的前三行。

方法2:分割字符串(更简单直观)

直接用|-分割文本,过滤空字符串后取需要的行:

rows_list = [row for row in text.split('|-') if row.strip()]
# 取前三行目标内容
ROWS = rows_list[:3]

这种方法无需正则,代码更易读,也能避免正则匹配的边界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:31:23