我会进入正题:我需要一个正则表达式来匹配列表中具有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=[^|}]).*)}}