Удалите повторяющиеся (перекрывающиеся) косые черты из строки - PullRequest
1 голос
/ 07 августа 2020

Я анализирую 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='')

Как видите, x.path по-прежнему содержат повторяющиеся косые черты, я пытаюсь удалить их, поэтому я попытался разделить, зациклить и заменить следующим образом:

>>> newpath = x.path.split('/')
['', 'path', 'to', '', '', '', '', 'foo', '', '', 'baz', '', 'bar']
>>> for i in newpath:
    if i == '':
        newpath.remove('')
>>> '/'.join(newpath)
'/path/to/foo/baz/bar'

Что дает желаемый результат, но я думаю, что это решение неэффективно и тра sh. Как мне сделать это лучше?

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Это то, для чего создаются регулярные выражения:

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

См. демонстрацию на regex101.com . Единственная реальная проблема - оставить любые двойные косые черты в протоколе такими, какие они есть, следовательно, новый модуль regex и (*SKIP)(*FAIL). Вы можете достичь той же функциональности с помощью функции просмотра назад в модуле re.

0 голосов
/ 07 августа 2020

Вы не должны изменять список, который вы повторяете. См. странный результат при удалении элемента из списка

Вы можете использовать понимание списка для создания списка без всех элементов ''.

newpath = [s in x.path.split('/') if s != '']
'/'.join(newpath)
0 голосов
/ 07 августа 2020
import re

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

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

Печать:

http://foo.bar/path/to/foo/baz/bar

EDIT: компиляция регулярного выражения:

import re

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

s = r.sub('/', s)
print(s)
...