匹配字符串末尾的正则表达式,排除最后一个字符为斜杠(/)的情况

2 投票
2 回答
1361 浏览
提问于 2025-04-17 05:40

目前,我有以下的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>.*?)/?$'

最后的$符号确保整个字符串都会被匹配,如果字符串末尾有斜杠的话,/?总是会匹配到这个斜杠。

撰写回答