正则表达式在 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}}
。
好的,结合 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*)*$
会起作用。
我正在尝试使用正则表达式将模板插入到页面中,在所有类别或 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}}
。
好的,结合
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*)*$
会起作用。