【发布时间】:2013-07-04 15:18:29
【问题描述】:
我正在尝试制作一个匹配如下内容的正则表达式:
[[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')
【问题讨论】:
-
您能否详细说明“但是,字符 : 应该允许在 uid 之后的任何位置”是什么意思?您给出的所有匹配项/不匹配项似乎都没有任何奇怪的字符顺序外观。
-
这有点类似于为C cmets编写正确的正则表达式的问题:
/* ** */可以做到,但是比较棘手。查找“C 注释正则表达式”以获取想法。
标签: python regex regex-negation