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

