Решил, что сегодня вечером выучу питон :) Я очень хорошо знаю C (написал на нем ОС), поэтому я не новичок в программировании, поэтому все в python кажется довольно простым, но я не знаю, как решить эту проблему: допустим, у меня есть этот адрес:
http://example.com/random/folder/path.html Теперь, как я могу создать из этого две строки, одна из которых содержит "базовое" имя сервера, поэтому в этом примере это будет http://example.com/ и другой, содержащий объект без последнего имени файла, поэтому в этом примере это будет http://example.com/random/folder/ . Также я, конечно, знаю возможность просто найти 3-ю и последнюю косую черту соответственно, но, возможно, вы знаете способ получше:] Также было бы здорово иметь завершающую косую черту в обоих случаях, но мне все равно, так как ее можно легко добавить. Так у кого-нибудь есть хорошее, быстрое и эффективное решение для этого? Или есть только «моё» решение, нахождение косых черт?
Спасибо!
Приходи завтра и расскажи нам, как у тебя дела. Я подозреваю, что вы будете писать код C на Python, а не на реальном коде Python :-).
С тех пор, как вы это упомянули, какую ОС вы написали?
Вы можете найти регулярное выражение Python для частичного разделения (то есть URL, схемы, домена, TLD, порта и пути запроса) здесь: stackoverflow.com/questions/9760588/…






У меня нет опыта работы с Python, но я нашел модуль urlparse, который должен работать.
В Python многие операции выполняются с использованием списков. Модуль urlparse, упомянутый Себасианом Дитцем, вполне может решить вашу конкретную проблему, но если вас в целом интересуют способы Pythonic для поиска слэшей в строках, например, попробуйте что-то вроде этого:
url = 'http://example.com/random/folder/path.html'
# Create a list of each bit between slashes
slashparts = url.split('/')
# Now join back the first three sections 'http:', '' and 'example.com'
basename = '/'.join(slashparts[:3]) + '/'
# All except the last one
dirname = '/'.join(slashparts[:-1]) + '/'
print 'slashparts = %s' % slashparts
print 'basename = %s' % basename
print 'dirname = %s' % dirname
Результат этой программы следующий:
slashparts = ['http:', '', 'example.com', 'random', 'folder', 'path.html'] basename = http://example.com/ dirname = http://example.com/random/folder/
Интересные биты - это split, join, массив нотации срезов [A: B] (включая отрицательные значения для смещений от конца) и, в качестве бонуса, оператор % для строк для форматирования в стиле printf.
Если это степень синтаксического анализа вашего URL, встроенный в Python rpartition выполнит эту работу:
>>> URL = "http://example.com/random/folder/path.html"
>>> Segments = URL.rpartition('/')
>>> Segments[0]
'http://example.com/random/folder'
>>> Segments[2]
'path.html'
Из Pydoc, str.rpartition:
Splits the string at the last occurrence of sep, and returns a 3-tuple containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, return a 3-tuple containing two empty strings, followed by the string itself
Это означает, что rpartition выполняет поиск за вас и разбивает строку по последнему (крайнему правому) вхождению указанного вами символа (в данном случае /). Он возвращает кортеж, содержащий:
(everything to the left of char , the character itself , everything to the right of char)
Модуль urlparse в python 2.x (или urllib.parse в python 3.x) был бы способом сделать это.
>>> from urllib.parse import urlparse
>>> url = 'http://example.com/random/folder/path.html'
>>> parse_object = urlparse(url)
>>> parse_object.netloc
'example.com'
>>> parse_object.path
'/random/folder/path.html'
>>> parse_object.scheme
'http'
>>>
Если вы хотите поработать над путем к файлу под URL-адресом, вы можете использовать модуль posixpath:
>>> from posixpath import basename, dirname
>>> basename(parse_object.path)
'path.html'
>>> dirname(parse_object.path)
'/random/folder'
После этого вы можете использовать posixpath.join, чтобы склеить части вместе.
Обновлено: Я совершенно забыл, что пользователи Windows будут задыхаться от разделителя пути в os.path. Я прочитал документацию модуля posixpath, и в ней есть специальная ссылка на манипуляции с URL-адресами, так что все в порядке.
+1 на urlparse, но не используйте os.path для управления частью .path. Обработка os.path обязательно отличается от ОС к ОС, тогда как URI всегда используют '/' в качестве разделителя частей пути.
да, удалите часть os.path. Возможно, вместо этого используйте модуль posixpath. Тогда вы получите мой голос.
ах, пропустил это полностью. Прошло много времени с тех пор, как я использовал окна: |. Фиксированный.
Для удобства, вот процедура для Py 2: import urlparse; parse_object = urlparse.urlparse(url)
Большое спасибо другим респондентам, которые указали мне правильное направление своими ответами!
Похоже, что модуль posixpath, упомянутый в ответе sykora, недоступен в моей настройке Python (python 2.7.3).
Согласно эта статья кажется, что "правильный" способ сделать это - использовать ...
urlparse.urlparse и urlparse.urlunparse могут использоваться для отсоединения и повторного присоединения основы URL-адреса.os.path можно использовать для управления путемurllib.url2pathname и urllib.pathname2url (чтобы сделать перенос имени пути переносимым, чтобы он мог работать в Windows и т.п.)Так, например (не считая повторного присоединения базового URL-адреса) ...
>>> import urlparse, urllib, os.path
>>> os.path.dirname(urllib.url2pathname(urlparse.urlparse("http://example.com/random/folder/path.html").path))
'/random/folder'
Вы можете использовать библиотеку python furl:
f = furl.furl("http://example.com/random/folder/path.html")
print(str(f.path)) # '/random/folder/path.html'
print(str(f.path).split("/")) # ['', 'random', 'folder', 'path.html']
Чтобы получить доступ к слову после первого "/", используйте:
str(f.path).split("/") # random
Возможно, вы захотите поделиться своим решением в коде.