正则表达式匹配没有特定命名参数的MediaWiki模板

时间:2017-08-15 07:08:54

标签: python regex python-2.7 mediawiki-templates

我会明白:我需要一个与列表中具有date参数的模板匹配的正则表达式 - 所以假设我的(现在单身)列表模板是“存根”,下面的内容应该是粗体:

  • {{stub}}
  • {{stub|param}}
  • {{stub|date=a}}
  • {{stub|param|date=a}}
  • {{stub|date=a|param}}
  • {{stub|param|date=a|param}} 注意:“param”表示任何数量的参数。

此外,如果日期参数为空,它也可以匹配,但这不是必需的。

到目前为止我目前的正则表达式是

{{((?:stub|inaccurate)(?!(?:\|.*?\|)*?\|date=.*?(?:\|.*?)*?)(?:\|.*?)*?)}}

但它匹配上面列表中的第四和第六项。

注意:(?:stub|inaccurate)只是为了确保模板是stubinaccurate模板。

注2:这里的正则表达式的味道是Python 2.7模块RE。

2 个答案:

答案 0 :(得分:1)

由于您使用的是Python,因此您拥有an actual parser的优势:

import mwparserfromhell
wikicode = mwparserfromhell.parse('{{stub|param|date=a|param}}')
for template in wikicode.filter_templates():
    if template.get('date')...

即使模板包含您不期望的内容({{stub| date=a}}{{stub|<!--<newline>-->date=a}}{{stub|foo={{bar}}|date=a}}等),这仍然是准确的。关于使用正则表达式解析复杂标记的危险的classic answer也适用于wikitext。

答案 1 :(得分:0)

我认为它有足够的负面预测,试图在任何位置匹配日期?

{{((?:stub|inaccurate)(?!.*\|date=).*)}}

如果空日期参数在等号后面有|,请使用

{{((?:stub|inaccurate)(?!.*\|date=[^|}]).*)}}