匹配字符串末尾的正则表达式,排除最后一个字符为斜杠(/)的情况
目前,我有以下的Python正则表达式:
r'^https?://(www.)?domain.com/?(?P<path>.*)/?$'
我想用这个来替换:
r'/\g<path>/'
这个替换效果很好,但有一个情况不太对,就是当字符串的最后一个字符是斜杠(/)时。在这种情况下,.*
会贪婪地匹配掉最后的那个/
,导致替换后的字符串变成了/path//
。
简单来说,我是想把一个绝对路径中的域名去掉,变成相对路径,并且确保这个相对路径的开头和结尾都有一个/
。
有没有办法让最后一个字符在匹配时排除掉,只有在它是/
的情况下?看起来我可能需要用到某种前瞻(look-ahead),但我不太确定该怎么写。
2 个回答
4
别用正则表达式来处理这个问题,建议你使用urlparse
模块。
下面是文档中的一个例子:
>>> from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
>>> o
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
params='', query='', fragment='')
>>> o.scheme
'http'
>>> o.port
80
>>> o.geturl()
'http://www.cwi.nl:80/%7Eguido/Python.html'
3
只需让星号变得懒惰:
r'^https?://(www.)?domain.com/?(?P<path>.*?)/?$'
最后的$
符号确保整个字符串都会被匹配,如果字符串末尾有斜杠的话,/?
总是会匹配到这个斜杠。