strip удаляет символы, заданные с обоих концов строки, в вашем случае она удаляет ".", "c", "o" и "m".
Truppo
6
Он также удалит эти символы с начала строки. Если вы просто хотите, чтобы его удалили с конца, используйте rstrip ()
Andre Miller
42
Да. str.strip не делает то, что вы думаете. str.strip удаляет любой из символов, указанных в начале и конце строки. Итак, «acbacda» .strip («ad») дает «cbac»; А в начале и да в конце были раздеты. Приветствия.
Scvalex
2
Плюс, это удаляет символы в любом порядке : "site.ocm"> "site".
Эрик О Лебиго
1
@scvalex, вау, только что понял это, использовав его таким образом целую вечность - это опасно, потому что код часто работает так или иначе
Flash
Ответы:
557
stripне означает "удалить эту подстроку". x.strip(y)обрабатывает yкак набор символов и удаляет любые символы в этом наборе с концовx .
Вместо этого вы можете использовать endswithи нарезки:
Да, я сам думаю, что первый пример с тестом endwith () был бы лучшим; регулярное выражение может повлечь за собой некоторое снижение производительности (разбор регулярного выражения и т. д.). Я бы не стал использовать rsplit (), но это потому, что я не знаю, чего именно вы пытаетесь достичь. Я полагаю, что он удаляет .com, если и только если он появляется в конце URL? Решение rsplit доставит вам неприятности, если вы будете использовать его на доменных именах, таких как «www.commercialthingie.co.uk»
Steef
13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
Бурхан Халид
1
Что делать, если я пишу EXAMLPLE.COMдоменные имена не чувствительны к регистру. (Это голосование за решение регулярных выражений)
Jasen
3
Это не перезапись, rsplit()решение не имеет такого же поведения, как и в endswith()случае, когда исходная строка не имеет подстроки в конце, но где-то посередине. Например: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"но"www.comeandsee.net".rsplit(".com",1)[0] == "www"
Steef
1
Синтаксис s[:-n]имеет предостережение: для n = 0, это не возвращает строку с обрезанными последними нулевыми символами, но вместо этого пустую строку.
BlenderBender
90
Если вы уверены, что строка появляется только в конце, то самый простой способ - использовать «заменить»:
это также заменит URL как www.computerhope.com. сделать проверку с endswith()и должно быть в порядке.
ghostdog74
72
"www.computerhope.com".endswith(".com")это правда, все равно сломается!
1
«Если вы уверены, что строка появляется только в конце», вы имеете в виду «Если вы уверены, что подстрока появляется только один раз»? Кажется, что замена также работает, когда подстрока находится посередине, но, как предполагает другой комментарий, она заменит любое вхождение подстроки, почему это должно быть в конце, я не понимаю
idclev 463035818
49
def strip_end(text, suffix):ifnot text.endswith(suffix):return text
return text[:len(text)-len(suffix)]
Это должно быть более эффективным, чем методы, использующие, split()поскольку новый объект списка не создается, и это решение работает для строк с несколькими точками.
Вау, это хороший трюк. Я не мог заставить это потерпеть неудачу, но мне также было трудно думать, как это может потерпеть неудачу. Мне нравится это, но это очень "волшебно", трудно понять, что это делает, просто глядя на это. Я должен был мысленно обработать каждую часть строки, чтобы «получить это».
DevPlayer
14
Это не работает, если искомая строка НЕ присутствует, и вместо этого неправильно удаляет последний символ.
robbat2
25
Зависит от того, что вы знаете о своем URL и что именно вы пытаетесь сделать. Если вы знаете, что он всегда будет заканчиваться на «.com» (или «.net» или «.org»), тогда
url=url[:-4]
это самое быстрое решение. Если это более общие URL-адреса, то вам, вероятно, лучше заглянуть в библиотеку urlparse, которая поставляется с python.
Если вы, с другой стороны, вы просто хотите удалить все после финального '.' в строке тогда
url.rsplit('.',1)[0]
будет работать. Или, если вы хотите, просто хотите, чтобы все до первого ». тогда попробуй
Если вам нужно удалить какой-то конец строки, если она существует, иначе ничего не делайте. Мои лучшие решения. Вы, вероятно, захотите использовать одну из первых двух реализаций, однако я включил третью для полноты.
Для постоянного суффикса:
def remove_suffix(v, s):return v[:-len(s)if v.endswith(s)else v
remove_suffix("abc.com",".com")=='abc'
remove_suffix("abc",".com")=='abc'
Для набора постоянных суффиксов асимптотически самый быстрый способ для большого количества вызовов:
def remove_suffix_preprocess(*suffixes):
suffixes = set(suffixes)try:
suffixes.remove('')exceptKeyError:passdef helper(suffixes, pos):if len(suffixes)==1:
suf = suffixes[0]
l =-len(suf)
ls = slice(0, l)returnlambda v: v[ls]if v.endswith(suf)else v
si = iter(suffixes)
ml = len(next(si))
exact =Falsefor suf in si:
l = len(suf)if-l == pos:
exact =Trueelse:
ml = min(len(suf), ml)
ml =-ml
suffix_dict ={}for suf in suffixes:
sub = suf[ml:pos]if sub in suffix_dict:
suffix_dict[sub].append(suf)else:
suffix_dict[sub]=[suf]if exact:del suffix_dict['']for key in suffix_dict:
suffix_dict[key]= helper([s[:pos]for s in suffix_dict[key]],None)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v[:pos])else:for key in suffix_dict:
suffix_dict[key]= helper(suffix_dict[key], ml)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v)return helper(tuple(suffixes),None)
domain_remove = remove_suffix_preprocess(".com",".net",".edu",".uk",'.tv','.co.uk','.org.uk')
последний, вероятно, значительно быстрее в pypy, чем в cpython. Вариант регулярного выражения, вероятно, быстрее, чем этот, практически для всех случаев, когда не используются огромные словари потенциальных суффиксов, которые нельзя легко представить в виде регулярного выражения, по крайней мере, в cPython.
В PyPy вариант регулярного выражения почти наверняка медленнее для большого количества вызовов или длинных строк, даже если модуль re использует механизм регулярных выражений DFA для компиляции, поскольку JIT оптимизирует подавляющее большинство служебных данных лямбды.
В cPython, однако, тот факт, что ваш выполняющийся код c для регулярных выражений почти наверняка сравнивает алгоритмические преимущества версии коллекции суффиксов почти во всех случаях.
Это работает с любым расширением, с потенциальными другими точками, существующими также в имени файла. Он просто разбивает строку в виде списка по точкам и объединяет ее без последнего элемента.
Однако, если процессор является узким местом, зачем писать на Python?
Во всяком случае, когда CPU - это горлышко бутылки? В драйверах, может быть.
Преимущество использования регулярных выражений заключается в возможности повторного использования кода. Что если в следующий раз вы захотите удалить «.me», в котором всего три символа?
В моем случае мне нужно было вызвать исключение, поэтому я сделал:
classUnableToStripEnd(Exception):"""A Exception type to indicate that the suffix cannot be removed from the text."""@staticmethoddef get_exception(text, suffix):returnUnableToStripEnd("Could not find suffix ({0}) on text: {1}.".format(suffix, text))def strip_end(text, suffix):"""Removes the end of a string. Otherwise fails."""ifnot text.endswith(suffix):raiseUnableToStripEnd.get_exception(text, suffix)return text[:len(text)-len(suffix)]
Ваш ответ для Python 3.9 является дубликатом этого ответа выше. На ваш ответ за предыдущие версии также много раз отвечали в этой теме, и он ничего не даст, если строка не имеет суффикса.
Ответы:
strip
не означает "удалить эту подстроку".x.strip(y)
обрабатываетy
как набор символов и удаляет любые символы в этом наборе с концовx
.Вместо этого вы можете использовать
endswith
и нарезки:Или используя регулярные выражения :
источник
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
доменные имена не чувствительны к регистру. (Это голосование за решение регулярных выражений)rsplit()
решение не имеет такого же поведения, как и вendswith()
случае, когда исходная строка не имеет подстроки в конце, но где-то посередине. Например:"www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
но"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
имеет предостережение: дляn = 0
, это не возвращает строку с обрезанными последними нулевыми символами, но вместо этого пустую строку.Если вы уверены, что строка появляется только в конце, то самый простой способ - использовать «заменить»:
источник
www.computerhope.com
. сделать проверку сendswith()
и должно быть в порядке."www.computerhope.com".endswith(".com")
это правда, все равно сломается!источник
return text[:-len(suffix)]
Поскольку кажется, что никто еще не указал на это:
Это должно быть более эффективным, чем методы, использующие,
split()
поскольку новый объект списка не создается, и это решение работает для строк с несколькими точками.источник
Зависит от того, что вы знаете о своем URL и что именно вы пытаетесь сделать. Если вы знаете, что он всегда будет заканчиваться на «.com» (или «.net» или «.org»), тогда
это самое быстрое решение. Если это более общие URL-адреса, то вам, вероятно, лучше заглянуть в библиотеку urlparse, которая поставляется с python.
Если вы, с другой стороны, вы просто хотите удалить все после финального '.' в строке тогда
будет работать. Или, если вы хотите, просто хотите, чтобы все до первого ». тогда попробуй
источник
Если вы знаете, что это расширение, то
Это работает одинаково хорошо с
abcdc.com
илиwww.abcdc.com
илиabcdc.[anything]
и является более расширяемым.источник
В одну строку:
источник
Как насчет
url[:-4]
?источник
.ca
или.co.uk
URL.Для URL-адресов (поскольку в данном примере это является частью темы) можно сделать что-то вроде этого:
Оба будут выводить:
('http://www.stackoverflow', '.com')
Это также можно сочетать с тем,
str.endswith(suffix)
если вам нужно просто разделить «.com» или что-то конкретное.источник
не совсем верно.
Что вам на самом деле нужно написать
И выглядит ИМХО довольно лаконично
Тем не менее, я предпочитаю эту опцию, потому что она использует только один параметр:
источник
Начиная с
Python 3.9
, вы можете использоватьremovesuffix
вместо:источник
Если вам нужно удалить какой-то конец строки, если она существует, иначе ничего не делайте. Мои лучшие решения. Вы, вероятно, захотите использовать одну из первых двух реализаций, однако я включил третью для полноты.
Для постоянного суффикса:
Для регулярного выражения:
Для набора постоянных суффиксов асимптотически самый быстрый способ для большого количества вызовов:
последний, вероятно, значительно быстрее в pypy, чем в cpython. Вариант регулярного выражения, вероятно, быстрее, чем этот, практически для всех случаев, когда не используются огромные словари потенциальных суффиксов, которые нельзя легко представить в виде регулярного выражения, по крайней мере, в cPython.
В PyPy вариант регулярного выражения почти наверняка медленнее для большого количества вызовов или длинных строк, даже если модуль re использует механизм регулярных выражений DFA для компиляции, поскольку JIT оптимизирует подавляющее большинство служебных данных лямбды.
В cPython, однако, тот факт, что ваш выполняющийся код c для регулярных выражений почти наверняка сравнивает алгоритмические преимущества версии коллекции суффиксов почти во всех случаях.
источник
Вы можете использовать сплит:
источник
a = 'www.computerbugs.com'
это'www
Если вы хотите удалить только расширение:
Это работает с любым расширением, с потенциальными другими точками, существующими также в имени файла. Он просто разбивает строку в виде списка по точкам и объединяет ее без последнего элемента.
источник
Я хочу повторить этот ответ как самый выразительный способ сделать это. Конечно, следующее займет меньше процессорного времени:
Однако, если процессор является узким местом, зачем писать на Python?
Во всяком случае, когда CPU - это горлышко бутылки? В драйверах, может быть.
Преимущество использования регулярных выражений заключается в возможности повторного использования кода. Что если в следующий раз вы захотите удалить «.me», в котором всего три символа?
Тот же код сделает свое дело:
источник
В моем случае мне нужно было вызвать исключение, поэтому я сделал:
источник
Здесь у меня есть самый простой код.
источник
Предполагая, что вы хотите удалить домен, независимо от того, что это (.com, .net и т. Д.). Я рекомендую найти
.
и удалить все с этого момента.Здесь я использую,
rfind
чтобы решить проблему URL-адресов,abcdc.com.net
которые должны быть сокращены до имениabcdc.com
.Если вы также беспокоитесь о
www.
s, вы должны явно проверить их:1 в замене для странных крайних случаев, таких как
www.net.www.com
Если ваш URL-адрес становится еще более диким, посмотрите на ответы регулярных выражений, на которые люди ответили.
источник
Я использовал встроенную функцию rstrip, чтобы сделать это следующим образом:
источник
"test.ccom"
.Это идеальное использование для регулярных выражений:
источник
Python> = 3.9:
Python <3.9:
источник