正则表达式匹配没有特定命名参数的 MediaWiki 模板
Regex to match MediaWiki template without certain named parameter
我要直截了当:我需要一个正则表达式来匹配列表 中具有 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)
只是为了确保模板是 stub
或 inaccurate
模板。
注2:此处regex的风格是Python 2.7 module RE.
我认为有一个否定的前瞻就足够了,它试图在任何位置匹配日期?
{{((?:stub|inaccurate)(?!.*\|date=).*)}}
如果空日期参数在等号后有 |
,则使用
{{((?:stub|inaccurate)(?!.*\|date=[^|}]).*)}}
由于您使用的是 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 关于使用正则表达式解析复杂标记的危险也适用于维基文本。
我要直截了当:我需要一个正则表达式来匹配列表 中具有 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)
只是为了确保模板是 stub
或 inaccurate
模板。
注2:此处regex的风格是Python 2.7 module RE.
我认为有一个否定的前瞻就足够了,它试图在任何位置匹配日期?
{{((?:stub|inaccurate)(?!.*\|date=).*)}}
如果空日期参数在等号后有 |
,则使用
{{((?:stub|inaccurate)(?!.*\|date=[^|}]).*)}}
由于您使用的是 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 关于使用正则表达式解析复杂标记的危险也适用于维基文本。