У меня есть следующий код:
url = 'abcdc.com'
print(url.strip('.com'))
Я ожидал: abcdc
Я получил: abcd
Теперь я делаю
url.rsplit('.com', 1)
Есть ли лучший способ??
strip
не означает «удалить эту подстроку». x.strip (y)
обрабатывает y
как набор символов и удаляет любые символы в этом наборе с концов x
.
Вместо этого вы можете использовать endswith
и нарезку:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
Или используя регулярные выражения:
import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
Если вы уверены, что строка появляется только в конце, то самым простым способом будет использование «заменить»:
url = 'abcdc.com'
print(url.replace('.com',''))
Поскольку кажется, что никто еще не указал на это:
url = "www.example.com"
new_url = url[:url.rfind(".")]
Это должно быть более эффективным, чем методы, использующие split ()
, так как новый объект списка не создается, и это решение работает для строк с несколькими точками.
Зависит от того, что вы знаете о своем URL и что именно вы пытаетесь сделать. Если вы знаете, что это всегда будет заканчиваться на «.com» (или «.net» или «.org»), тогда
url=url[:-4]
это самое быстрое решение. Если это более общие URL-адреса, то вам, вероятно, лучше заглянуть в библиотеку urlparse, которая поставляется с питоном.
Если вы, с другой стороны, просто хотите удалить все после финала ».'в строке тогда
url.rsplit('.',1)[0]
будет работать. Или, если вы хотите, просто хотите все до первого ».' тогда попробуй
url.split('.',1)[0]
В одной строке:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Если вы знаете, что это расширение, тогда
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
Это одинаково хорошо работает с abcdc.com
или www.abcdc.com
или abcdc.[что угодно]
и более расширяемо.
Как насчет url [: -4]
?
Для URL (как кажется, часть темы в данном примере) можно сделать что-то вроде этого:
import os
url = 'http://www.stackoverflow.com'
name,ext = os.path.splitext(url)
print (name, ext)
#Or:
ext = '.'+url.split('.')[-1]
name = url[:-len(ext)]
print (name, ext)
Оба выведут:
('http://www.stackoverflow', '.com')
Это также можно комбинировать с str.endswith (suffix)
, если вам нужно просто разделить «.com» или что-то конкретное.
url.rsplit ('.com', 1)
не совсем верно.
То, что вам на самом деле нужно написать, это
url.rsplit('.com', 1)[0]
и это выглядит довольно лаконично ИМХО .
Однако я лично предпочитаю эту опцию, потому что она использует только один параметр:
url.rpartition('.com')[0]
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Я хочу повторить этот ответ как самый выразительный способ сделать это. Конечно, следующее займет меньше времени процессора
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Однако, если CPU - это горловина бутылки, зачем писать на Python?
Когда процессор - горловина бутылки в любом случае?? в драйверах, может быть.
Преимущества использования регулярного выражения - возможность повторного использования кода. Что делать, если вы в следующий раз захотите удалить «.me», который имеет только три символа?
Тот же код поможет.
>>> rm_sub('abcdc.me','.me')
'abcdc'
Если вы хотите снять только расширение
url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))
Он работает с любым расширением, с потенциальными другими точками, существующими в имени файла. Он просто разделяет строку на список точек и присоединяется к ней без последнего элемента.
Наверное, не самый быстрый, но для меня это более читабельно, чем другие методы.
Это идеальное использование для регулярных выражений:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
В моем случае мне нужно было выдвинуть исключение, поэтому я сделал:
class UnableToStripEnd(Exception):
"""A Exception type to indicate that the suffix cannot be removed from the text."""
@staticmethod
def get_exception(text, suffix):
return UnableToStripEnd("Could not find suffix ({0}) on text: {1}."
.format(suffix, text))
def strip_end(text, suffix):
"""Removes the end of a string. Otherwise fails."""
if not text.endswith(suffix):
raise UnableToStripEnd.get_exception(text, suffix)
return text[:len(text)-len(suffix)]