正则表达式在 mediawiki 类别链接之前插入内容

Regex to insert content just before mediawiki category links

我正在尝试使用正则表达式将模板插入到页面中,在所有类别或 interwiki 链接之前,但在其他所有内容之后。 所以如果你有一个这样结束的页面:

== See Also ==
* [[Link one]]
* [[more link]]
* [//external.link external link]

[[Category:Pages]]
[[de:Spezial Page]]

我希望将模板 {{template}} 插入到 [[Category:Pages]] 之前但在其他所有内容之后。

注意:最后一部分不一定是列表 - 它可以是

== References ==
<references/>

甚至其他东西。重点是将其插入到末尾所有 category/interwiki 链接之前,但在最后一部分之后。

什么正则表达式可以帮助我做到这一点?我已经尝试将 (?P<pre>[\s\S]+)(?P<cats>(?:\[\[[^]]:[^]]\]\])*$) 作为匹配表达式,将 \g<pre>{{template}}\n\g<cats> 作为替换表达式,但这只是将它插入到最后。

正则表达式风格:Python 2

根据您的示例,正​​则表达式的 (==.+\s(?:[\*][\s].+\s)+) 和替换表达式的 {{template}}\n 将正常工作。

演示:https://regex101.com/r/BPBmFL

但也许你有更多的情况是它不起作用。

编辑:

试试这个正则表达式 ((.|\n)*)(\[\[.*\:.*\]\]\n) 和这个 {{template}}\n\n 替换。

这样它会找到 category/interwiki 链接之前的所有内容,您可以在类别之后和类别之前插入 {{template}}

演示:https://regex101.com/r/Bv14kt/4

好的,结合 and ,我想通了:

import re
import mwparserfromhell as mw
#get content of page
wikicode = mw.parse(content)
links = wikicode.filter_wikilinks()
links = list(filter(lambda link: re.match(r'\[\[(Category:|[a-z][a-z]:).*\]\]', links))
wikicode.insert_before(links[0], '{{template}}')
content = str(wikicode)

抱歉占用您的时间!

实际上正则表达式 足够强大来完成这个特定的任务,尽管通常使用它们来解析 wiki 文本确实是个坏主意。像

(\[\[(Category|\w{2,3}(-\w+){0,2}):[^\[\]<>]+\]\]\s*)*$

会起作用。