我正在尝试使用正则表达式在所有类别或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
答案 0 :(得分:2)
好的,结合jpmc26's comment和mmm'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
。
答案 2 :(得分:0)
实际上,正则表达式 对于这个特定的任务来说足够强大,尽管通常使用它们解析wikitext确实是个坏主意。像
这样的东西(\[\[(Category|\w{2,3}(-\w+){0,2}):[^\[\]<>]+\]\]\s*)*$
会起作用。