2017-11-11 61 views
0

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

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

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

我希望模板{{template}}[[Category:Pages]]之前,但一切后插入。

注:最后一节不一定是一个列表 - 它可能是

== References == 
<references/> 

甚至别的东西。重点是在最后一部分的所有类别/词组间链接之前插入它,但在最后一部分之后。

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

正则表达式的味道:Python的2

+0

https://stackoverflow.com/a/1732454/1394393使用真正的解析器。 – jpmc26

+0

@ jpmc26任何“真正的解析器”我可以用于这个目的? –

+0

不知道。我从未使用Media Wiki。 (但是我知道当你使用的文本处理引擎对于你正在使用的语言来说不够强大。)[Google](https://www.google.com/search?q=python + mediawiki +解析器)出现了一些看起来很有前途的结果。 – jpmc26

回答

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) 

对不起,你的时间!

+0

请注意,许多interwiki语言有三个字母的代码,有些具有相当不规则的名称,如'be-x-old'或'zh-min-nan'(请参阅完整列表[here](https://phabricator.wikimedia。组织/源/的mediawiki /浏览/主/语言/数据/ Names.php))。另外,如果维基语言不是英语'类别'可以本地化。 – Tgr

+0

@Tgr我知道这一点,但在我们的案例中,interwikis只有两位数字,维基语言是英文。 –

1

从你的例子这个(==.+\s(?:[\*][\s].+\s)+)对正则表达式和\1{{template}}\n的替代表达会工作得很好。

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

但是,也许你有更多的情况下,这是行不通的。

编辑:

试试这个正则表达式((.|\n)*)(\[\[.*\:.*\]\]\n)\1{{template}}\n\n\3代。

通过这种方式,它将找到所有内容,直到类别/间隔符链接,并且您可以在类别之前和之前插入{{template}}

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

+0

是的,还有类似== ==参考文献== \ n ',并且不具体参见。基本上它需要在最后一节之后立即插入,而不管该节的内容如何,​​但_before_ category/interwiki链接。 –

+0

@Ken Hilton我编辑我的答案也许这是帮助。 – mmm

+0

在你的演示中有效,但它在最后_two_类别链接之前插入模板 - 请参阅[this](https://regex101.com/r/Bv14kt/5)。 –

0

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

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

会工作。

+0

嗯,非常好。但是,我确实使用mwparserfromhell(您过去曾向我推荐过)(请参阅我的答案)找出解决方案。我会记住这一点,谢谢! –