У меня есть следующий код:
url = 'abcdc.com'
print(url.strip('.com'))
Я ожидал: abcdc
Я получил: abcd
Теперь я делаю
url.rsplit('.com', 1)
Есть ли лучший способ?
У меня есть следующий код:
url = 'abcdc.com'
print(url.strip('.com'))
Я ожидал: abcdc
Я получил: abcd
Теперь я делаю
url.rsplit('.com', 1)
Есть ли лучший способ?
strip
не означает "удалить эту подстроку". x.strip(y)
рассматривает y
как набор символов и разбивает любые символы в этом наборе с концов x
.
Вместо этого вы можете использовать endswith
и endswith
:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
Или используя регулярные выражения:
import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
Если вы уверены, что строка появляется только в конце, то самым простым способом было бы использовать 'replace':
url = 'abcdc.com'
print(url.replace('.com',''))
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
Так как кажется, что никто еще не указал на это:
url = "www.example.com"
new_url = url[:url.rfind(".")]
Это должно быть более эффективным, чем методы, использующие split()
, поскольку новый объект списка не создается, и это решение работает для строк с несколькими точками.
В зависимости от того, что вы знаете о своем URL-адресе, и что именно вы пытаетесь сделать. Если вы знаете, что он всегда будет заканчиваться на ".com" (или ".net" или ".org" ), то
url=url[:-4]
- самое быстрое решение. Если это более общие URL-адреса, вам, вероятно, лучше смотреть в библиотеку urlparse, которая поставляется с python.
Если вы, с другой стороны, просто хотите удалить все после финального '.' в строке, тогда
url.rsplit('.',1)[0]
будет работать. Или, если вы хотите, просто хотите, чтобы все было до первого ". затем попробуйте
url.split('.',1)[0]
В одной строке:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Как насчет url[:-4]
?
Если вы знаете это расширение, то
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
Это одинаково хорошо работает с abcdc.com
или www.abcdc.com
или abcdc.[anything]
и более расширяемо.
Для 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'
Это идеальное использование для регулярных выражений:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
Или вы можете использовать split:
a = 'abccomputer.com'
res = a.split('.com',1)[0]
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)]
Если вы хотите удалить только расширение
url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))
Он работает с любым расширением, с потенциальными другими точками, существующими в имени файла. Он просто разбивает строку на список по точкам и соединяет ее без последнего элемента.
Вероятно, не самый быстрый, но для меня он более читабельен, чем другие методы.
Я не вижу ничего плохого в том, как вы делаете это с помощью rsplit, он делает именно то, что вы хотите. Все зависит от того, насколько универсальным вы хотите решение. Вы всегда хотите удалить .com, или это иногда будет?org? Если это так, используйте одно из других решений, иначе придерживайтесь rsplit()
Причина, по которой strip() не работает так, как вы ожидаете, заключается в том, что она работает на каждом персонаже отдельно. Он сканирует вашу строку и удаляет все вхождения символов с конца И спереди. Поэтому, если ваша строка начинается с 'c', это также исчезнет. Вы использовали бы rstrip только для того, чтобы убираться со спины.