Python 从字符串中删除重复(重叠)斜杠
我正在像这样解析URLPython 从字符串中删除重复(重叠)斜杠,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,它的路径格式不正确,经常出现/,如下所示:
>>> 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(参见我的编辑)