【问题标题】:Regex to insert content just before mediawiki category links正则表达式在 mediawiki 类别链接之前插入内容
【发布时间】:2018-04-24 08:59:48
【问题描述】:

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

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

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

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

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

== References ==
<references/>

甚至是别的东西。重点是将其插入到最后所有类别/跨维基链接之前,但在最后一节之后。

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

正则表达式风格:Python 2

【问题讨论】:

  • stackoverflow.com/a/1732454/1394393 使用真正的解析器。
  • @jpmc26 我可以使用任何“真正的解析器”吗?
  • 不知道。我从未使用过媒体维基。 (但我确实知道,当您使用的文本处理引擎对于您正在使用的语言来说还不够强大时。)Google 出现了一些看起来很有希望的结果。

标签: regex mediawiki python-2.x


【解决方案1】:

好吧,结合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)

抱歉耽误您的时间!

【讨论】:

  • 请注意,许多跨wiki语言都有三个字母的代码,有些语言的名称相当不规则,例如be-x-oldzh-min-nan(参见完整列表here)。此外,如果 wiki 语言不是英语,Category 也可以本地化。
  • @Tgr 我知道这一点,但在我们的例子中,跨维基只有两位数,维基语言是英语。
【解决方案2】:

在您的示例中,(==.+\s(?:[\*][\s].+\s)+) 用于正则表达式,\1{{template}}\n 用于替代表达式。

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

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

编辑:

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

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

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

【讨论】:

  • 是的,还有==References==\n&lt;references/&gt; 之类的情况,但不具体另见。基本上它需要在最后一节之后立即插入,无论该节的内容如何,​​但类别/跨wiki链接之前。
  • 这在您的演示中有效,但它在最后 两个 类别链接之前插入模板 - 请参阅 this
【解决方案3】:

实际上,正则表达式 足以胜任这项特定任务,尽管通常使用它们来解析 wikitext 确实是个坏主意。类似的东西

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

会起作用的。

【讨论】:

  • 嗯,非常好。但是,我确实找到了使用 mwparserfromhell 的解决方案(您过去曾向我推荐过)(请参阅我的回答)。不过我会记住这一点,谢谢!
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多