Как удалить подстроку из конца строки в Python?

У меня есть следующий код:

url = 'abcdc.com'
print(url.strip('.com'))

Я ожидал: abcdc

Я получил: abcd

Теперь я делаю

url.rsplit('.com', 1)

Есть ли лучший способ?

Ответ 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)

Ответ 2

Если вы уверены, что строка появляется только в конце, то самым простым способом было бы использовать 'replace':

url = 'abcdc.com'
print(url.replace('.com',''))

Ответ 3

def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]

Ответ 4

Так как кажется, что никто еще не указал на это:

url = "www.example.com"
new_url = url[:url.rfind(".")]

Это должно быть более эффективным, чем методы, использующие split(), поскольку новый объект списка не создается, и это решение работает для строк с несколькими точками.

Ответ 5

В зависимости от того, что вы знаете о своем URL-адресе, и что именно вы пытаетесь сделать. Если вы знаете, что он всегда будет заканчиваться на ".com" (или ".net" или ".org" ), то

 url=url[:-4]

- самое быстрое решение. Если это более общие URL-адреса, вам, вероятно, лучше смотреть в библиотеку urlparse, которая поставляется с python.

Если вы, с другой стороны, просто хотите удалить все после финального '.' в строке, тогда

url.rsplit('.',1)[0]

будет работать. Или, если вы хотите, просто хотите, чтобы все было до первого ". затем попробуйте

url.split('.',1)[0]

Ответ 6

В одной строке:

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]

Ответ 7

Как насчет url[:-4]?

Ответ 8

Если вы знаете это расширение, то

url = 'abcdc.com'
...
url.rsplit('.', 1)[0]  # split at '.', starting from the right, maximum 1 split

Это одинаково хорошо работает с abcdc.com или www.abcdc.com или abcdc.[anything] и более расширяемо.

Ответ 9

Для 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" или что-то конкретное.

Ответ 10

url.rsplit('. com', 1)

не совсем верно.

На самом деле вам нужно написать

url.rsplit('.com', 1)[0]

и он выглядит довольно сжатым ИМХО.

Однако мой личный предпочтение - это этот параметр, потому что он использует только один параметр:

url.rpartition('.com')[0]

Ответ 11

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'

Ответ 12

Это идеальное использование для регулярных выражений:

>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'

Ответ 13

Или вы можете использовать split:

a = 'abccomputer.com'
res = a.split('.com',1)[0]

Ответ 14

def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'

Ответ 15

В моем случае мне нужно было создать исключение, поэтому я сделал:

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)]

Ответ 16

Если вы хотите удалить только расширение

url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))

Он работает с любым расширением, с потенциальными другими точками, существующими в имени файла. Он просто разбивает строку на список по точкам и соединяет ее без последнего элемента.

Вероятно, не самый быстрый, но для меня он более читабельен, чем другие методы.

Ответ 17

Я не вижу ничего плохого в том, как вы делаете это с помощью rsplit, он делает именно то, что вы хотите. Все зависит от того, насколько универсальным вы хотите решение. Вы всегда хотите удалить .com, или это иногда будет?org? Если это так, используйте одно из других решений, иначе придерживайтесь rsplit()

Причина, по которой strip() не работает так, как вы ожидаете, заключается в том, что она работает на каждом персонаже отдельно. Он сканирует вашу строку и удаляет все вхождения символов с конца И спереди. Поэтому, если ваша строка начинается с 'c', это также исчезнет. Вы использовали бы rstrip только для того, чтобы убираться со спины.