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

时间:2017-11-11 04:56:28

标签: regex mediawiki python-2.x

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

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

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

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

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

== References ==
<references/>

甚至是别的东西。关键是在结尾处所有类别/ interwiki链接之前插入它,但在最后一节之后插入它。

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

正则表达式:Python 2

3 个答案:

答案 0 :(得分:2)

好的,结合jpmc26's commentmmm's answer,我明白了:

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)

抱歉花时间!

答案 1 :(得分:1)

从您的示例中,此@font-face { font-family: 'MyWebFont'; src: url('webfont.eot'); /* IE9 Compat Modes */ src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('webfont.woff2') format('woff2'), /* Super Modern Browsers */ url('webfont.woff') format('woff'), /* Pretty Modern Browsers */ url('webfont.ttf') format('truetype'), /* Safari, Android, iOS */ url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */ } 表示正则表达式,(==.+\s(?:[\*][\s].+\s)+)表示替换表达式可以正常工作。

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

但也许你有更多的案例它不会起作用。

编辑:

尝试使用此正则表达式\1{{template}}\n和此((.|\n)*)(\[\[.*\:.*\]\]\n)替换。

通过这种方式,它会在类别/ interwiki链接之前找到所有内容,您可以在类别之前和之前插入\1{{template}}\n\n\3

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

答案 2 :(得分:0)

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

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

会起作用。