Python 从字符串中删除重复(重叠)斜杠

Python 从字符串中删除重复(重叠)斜杠,python,string,split,overlapping,Python,String,Split,Overlapping,我正在像这样解析URL >>> from urllib.parse import urlparse >>> urlparse('http://foo.bar/path/to/heaven') ParseResult(scheme='http', netloc='foo.bar', path='/path/to/heaven', params='', query='', fragment='') 假设我有一个URL,它的路径格式不正确,经常出现/,如下所示:

我正在像这样解析URL

>>> from urllib.parse import urlparse
>>> urlparse('http://foo.bar/path/to/heaven')
ParseResult(scheme='http', netloc='foo.bar', path='/path/to/heaven', params='', query='', fragment='')
假设我有一个URL,它的路径格式不正确,经常出现
/
,如下所示:

>>> x = urlparse('http://foo.bar/path/to/////foo///baz//bar'))
ParseResult(scheme='http', netloc='foo.bar', path='/path/to/////foo///baz//bar', params='', query='', fragment='')
>>> newpath = x.path.split('/')
['', 'path', 'to', '', '', '', '', 'foo', '', '', 'baz', '', 'bar']
>>> for i in newpath:
    if i == '':
        newpath.remove('')
>>> '/'.join(newpath)
'/path/to/foo/baz/bar'
如您所见,
x.path
仍然包含反复出现的斜杠,我正在尝试删除它们,因此我尝试过拆分、循环和替换,如下所示:

>>> x = urlparse('http://foo.bar/path/to/////foo///baz//bar'))
ParseResult(scheme='http', netloc='foo.bar', path='/path/to/////foo///baz//bar', params='', query='', fragment='')
>>> newpath = x.path.split('/')
['', 'path', 'to', '', '', '', '', 'foo', '', '', 'baz', '', 'bar']
>>> for i in newpath:
    if i == '':
        newpath.remove('')
>>> '/'.join(newpath)
'/path/to/foo/baz/bar'

这将提供所需的输出,但我认为这种解决方案效率低下,而且是垃圾。如何才能做得更好?

这就是正则表达式的用途:

import regex as re

url = "http://foo.bar/path/to/////foo///baz//bar"

rx = re.compile(r'(?:(?:http|ftp)s?://)(*SKIP)(*FAIL)|/+')
url = rx.sub('/', url)
print(url)
这就产生了

http://foo.bar/path/to/foo/baz/bar
看。唯一真正的问题是在协议中保留任何前向斜杠,因此更新的
regex
模块和
(*SKIP)(*FAIL)
。您可以通过
re
模块中的lookbehinds实现相同的功能

import re

s = 'http://foo.bar/path/to/////foo///baz//bar'

s = re.sub(r'(?<!:)/{2,}', '/', s)
print(s)

编辑:编译正则表达式:

import re

s = 'http://foo.bar/path/to/////foo///baz//bar'
r = re.compile(r'(?<!:)/{2,}')

s = r.sub('/', s)
print(s)
重新导入
s=http://foo.bar/path/to/////foo///baz//bar'

r=re.compile(r’(?您不应该修改正在迭代的列表。请参阅

您可以使用列表理解来创建一个没有所有
'
元素的列表

newpath = [s in x.path.split('/') if s != '']
'/'.join(newpath)

你试过正则表达式的方法吗?@jsb不,我读过关于正则表达式速度慢,最多应该避免,这就是为什么我没有想到使用正则表达式。正则表达式速度慢可能不是真的。你认为这种方法比正则表达式快还是对数百万个URL的性能微不足道?你认为这种方法比@barmar list快吗理解答案或其对数百万个URL的可忽略性能?你认为这种方法比@barmar list comprehension和Jan regex answer或其对数百万个URL的可忽略性能快吗?@tofu唯一的方法是测试它。但要加快速度,请先编译regex(参见我的编辑)