我正在尝试制作一个匹配如下内容的正则表达式:
[[uid::page name|page alias]]
例如:
[[nw::Home|Home page]]
uid 和页面别名都是可选的。
我想允许分隔符::
或|
仅出现一次,并且仅按显示的顺序出现。但是,:
应该允许在 uid 之后的任何位置使用该字符。问题就在这里。
以下正则表达式工作得很好,除了它匹配::
出现两次或出现在错误位置的字符串:
regex = r'\[\[([\w]+::)?([^|\t\n\r\f\v]+)(\|[^|\t\n\r\f\v]+)?\]\]'
re.match(regex, '[[Home]]') # matches, good
re.match(regex, '[[Home|Home page]]') # matches, good
re.match(regex, '[[nw::Home]]') # matches, good
re.match(regex, '[[nw::Home|Home page]]') # matches, good
re.match(regex, '[[nw|Home|Home page]]') # doesn't match, good
re.match(regex, '[[nw|Home::Home page]]') # matches, bad
re.match(regex, '[[nw::Home::Home page]]') # matches, bad
我已经阅读了所有关于负前瞻和后瞻表达式的信息,但我不知道如何在这种情况下应用它们。任何建议,将不胜感激。
编辑:我还想知道如何防止分隔符包含在匹配结果中,如下所示:
('nw::', 'Home', '|Home page')