Строка Strip () с номером [duplicate]

Наступил другой день, когда я работал над собственной проблемой. Мне нравится подход Луки Ране, но я думал, что использование класса Counter в библиотеке коллекций показалось скромным. Вот мой код:

def unique_permutations(elements):
    "Returns a list of lists; each sublist is a unique permutations of elements."
    ctr = collections.Counter(elements)

    # Base case with one element: just return the element
    if len(ctr.keys())==1 and ctr[ctr.keys()[0]] == 1:
        return [[ctr.keys()[0]]]

    perms = []

    # For each counter key, find the unique permutations of the set with
    # one member of that key removed, and append the key to the front of
    # each of those permutations.
    for k in ctr.keys():
        ctr_k = ctr.copy()
        ctr_k[k] -= 1
        if ctr_k[k]==0: 
            ctr_k.pop(k)
        perms_k = [[k] + p for p in unique_permutations(ctr_k)]
        perms.extend(perms_k)

    return perms

Этот код возвращает каждую перестановку в виде списка. Если вы будете кормить его строкой, она даст вам список перестановок, где каждый из них представляет собой список символов. Если вы хотите, чтобы результат был как список строк (например, если вы ужасный человек, и вы хотите злоупотреблять моим кодом, чтобы помочь вам обмануть Scrabble), просто выполните следующие действия:

[''.join(perm) for perm in unique_permutations('abunchofletters')]
260
задан Martin Thoma 9 April 2015 в 19:54
поделиться

16 ответов

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)
386
ответ дан user2357112 16 August 2018 в 05:50
поделиться
  • 1
    Я проголосовал за метод non regex – Dominic Rodger 24 June 2009 в 16:05
  • 2
    Да, я сам думаю, что первый пример с тестом endswith () был бы лучшим; регулярное выражение будет включать некоторое ограничение производительности (разбор регулярного выражения и т. д.). Я бы не пошел с rsplit (), но это потому, что я не знаю, чего именно вы пытаетесь достичь. Я полагаю, что он удаляет .com, если и только если он появляется в конце URL-адреса? Решение rsplit даст вам проблемы, если вы будете использовать его для доменных имен, таких как «www.commercialtingie.co.uk», – Steef 24 June 2009 в 16:26
  • 3
    url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url – Burhan Khalid 7 May 2013 в 05:56
  • 4
    Хотя первое является общепринятым решением python, оно плохое, поскольку оно ломается DRY. Когда вы меняете строку, вы также должны обновлять индекс. Или вы не делаете и не получаете нежелательного поведения. Уродливый код, подверженный ошибкам. Я обвиняю питона. – yac 1 September 2013 в 17:31
  • 5
    @yac, не повторяйте себя: remove='.com' ... url = url[:-len(remove)] – Jasen 26 March 2015 в 03:50

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

>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
0
ответ дан Aaron Maenpaa 16 August 2018 в 05:50
поделиться
  • 1
    Вы также должны добавить $, чтобы убедиться, что вы сопоставляете имена хостов end в & quot; .com & quot ;. – Cristian Ciupitu 24 June 2009 в 15:56
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
0
ответ дан csmckelvey 16 August 2018 в 05:50
поделиться
  • 1
    Не отправляйте код только в качестве ответа. Объясните что-то, что с ним связано. Пожалуйста, прочитайте stackoverflow.com/help/how-to-answer – Pra Jazz 17 July 2014 в 04:50
  • 2
    Привет и приветствуем переполнение стека. как отметил Орион, это вполне может решить проблему ... но было бы хорошо, если бы вы могли дать небольшое объяснение о том, как и почему это работает :) Есть кучи новичков в переполнении стека, и они могут научиться чему-то или два из вашего опыта - то, что очевидно для вас, может быть не так для них. – Taryn East 17 July 2014 в 05:17

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

 url=url[:-4]

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

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

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

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

url.split('.',1)[0]
18
ответ дан dagw 16 August 2018 в 05:50
поделиться

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

9
ответ дан Daren Thomas 16 August 2018 в 05:50
поделиться

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

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
9
ответ дан David Foster 16 August 2018 в 05:50
поделиться

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

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

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

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

0
ответ дан Dcs 16 August 2018 в 05:50
поделиться
def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]
34
ответ дан Eric Lebigot 16 August 2018 в 05:50
поделиться
  • 1
    Если вы знаете, что суффикс не пуст (например, когда он является константой), то: return text [: - len (suffix)] – MarcH 31 July 2013 в 15:03
  • 2
    Благодарю. Последняя строка может быть сокращена: return text[:-len(suffix)] – Jabba 2 August 2013 в 07:07
  • 3
    @Jabba: К сожалению, это не будет работать для пустых суффиксов, как упомянуто fuenfundachtzig. – yairchu 2 August 2013 в 14:50
  • 4
    Это настолько полезно для столь общей задачи, что она должна быть частью самого Python. – PhML 3 May 2014 в 18:16

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

6
ответ дан JHolta 16 August 2018 в 05:50
поделиться

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

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)]
0
ответ дан juan Isaza 16 August 2018 в 05:50
поделиться

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

a = 'abccomputer.com'
res = a.split('.com',1)[0]
0
ответ дан Lucas 16 August 2018 в 05:50
поделиться

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

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

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

28
ответ дан Maggyero 16 August 2018 в 05:50
поделиться
  • 1
    Ничего себе, это хороший трюк. Я не мог заставить это потерпеть неудачу, но мне также трудно было придумать, как это может потерпеть неудачу. Мне это нравится, но это очень «волшебный», трудно понять, что это делает, просто глядя на него. Мне приходилось мысленно обрабатывать каждую часть строки, чтобы «получить ее». – DevPlayer 7 April 2015 в 13:32
  • 2
    Это не выполняется, если искомая строка НЕ ​​присутствует, и она ошибочно удаляет последний символ. – robbat2 19 September 2015 в 20:15

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

url = 'abcdc.com'
print url.replace('.com','')
49
ответ дан naught101 16 August 2018 в 05:50
поделиться
  • 1
    который также заменит url как www.computerhope.com. сделайте чек с endswith(), и все должно быть хорошо. – ghostdog74 7 March 2010 в 01:26
  • 2
    "www.computerhope.com".endswith(".com") правда, он все равно сломается! – user 23 March 2015 в 21:31
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)

Однако, если процессор - это горлышко бутылки, зачем писать в Python?

Когда CPU - это шейка бутылки? в драйверах, возможно.

Преимущества использования регулярного выражения - это повторное использование кода. Что делать, если вам нужно удалить «.me», который имеет только три символа?

Тот же код выполнит трюк.

>>> rm_sub('abcdc.me','.me')
'abcdc'
1
ответ дан user1854182 16 August 2018 в 05:50
поделиться

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

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

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

7
ответ дан Vadim Kotov 16 August 2018 в 05:50
поделиться

url.rsplit ('. com', 1)

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

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

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

, и это выглядит довольно сжатым IMHO.

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

url.rpartition('.com')[0]
1
ответ дан winni2k 16 August 2018 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: