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



我会进入正题:我需要一个正则表达式来匹配列表中具有date参数的任何模板 - 所以假设我的(现在单例(模板列表是"存根",下面粗体的内容应该匹配:

  • {{stub}}
  • {{stub|param}}
  • {{stub|date=a}}
  • {{stub|param|date=a}}
  • {{stub|date=a|param}}
  • {{stub|param|date=a|param}}注意:"参数"表示那里的任意数量的参数。

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

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

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

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

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

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

由于您使用的是 Python,因此您可以奢侈地使用实际的解析器:

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}}等(,这也将保持准确。关于使用正则表达式解析复杂标记的危险的经典答案也适用于wiki文本。

我认为有一个消极的前瞻性就足够了,它试图在任何位置匹配日期?

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

如果空日期参数的等号后面有一个|,则使用

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

最新更新