2009-05-24 4 views
63

У меня есть строка. Как удалить весь текст после определенного символа? (В этом случае ...)
Текст после воли ... изменения, так что я, поэтому я хочу, чтобы удалить все символы после определенного один.Как удалить все символы после определенного символа в python?

+5

Если вы не уверены в том, что это имеет смысл, затем обновите свой вопрос, чтобы предоставить конкретные примеры того, что вы хотите сделать. –

ответ

118

Сплит на вашем сепараторе не более одного раза, и принять первый кусок :

sep = '...' 
rest = text.split(sep, 1)[0] 

Вы не сказали, что должно произойти, если разделитель отсутствует. И это, и решение Alex вернут всю строку в этом случае.

+0

Запрос «удалить весь текст после» разделителя, а не «получить» этот текст, поэтому я думаю, что вы хотите [0], а не [-1], в отличном от вас решении. –

+0

Работал отлично, потому что я уверен, что Айман и Алекс сделали так же, так что спасибо всем. – Solihull

+3

Используйте rsplit(), если вам нужно разделить символ, начиная с конца строки. – Samuel

7

Без RE (который я предполагаю, что вы хотите):

def remafterellipsis(text): 
    where_ellipsis = text.find('...') 
    if where_ellipsis == -1: 
    return text 
    return text[:where_ellipsis + 3] 

или с RE:

import re 

def remwithre(text, there=re.compile(re.escape('...')+'.*')): 
    return there.sub('', text) 
+0

Можете использовать sep = '...' как kwarg и использовать len (sep) вместо жесткого кодирования 3, чтобы сделать его немного более надежным в будущем. – cdleary

+0

Да, но тогда вам нужно перекомпилировать RE для каждого вызова, поэтому производительность для решения RE (нет реальной разницы для решения без RE). Некоторая общность бесплатна, некоторые не ... ;-) –

+0

@Alex - Спасибо за тестирование решений! –

54

Предполагая, что ваш разделитель «...», но это может быть любая строка.

text = 'some string... this part will be removed.' 
head, sep, tail = text.partition('...') 

>>> print head 
some string 

Если разделитель не найден, head будет содержать все исходную строку.

Функция разделения была добавлена ​​в Python 2.5.

раздел (...) S.partition (сентябрь) -> (голова, Сентябрь, хвост)

Searches for the separator sep in S, and returns the part before it, 
the separator itself, and the part after it. If the separator is not 
found, returns S and two empty strings. 
+0

Еще одно отличное решение - нарушаем ли мы TOOOWTDI?) Возможно, стоит потратить время на проверку ... –

+8

.partition wins - 0.756 usec за цикл, vs 1.13 для .split (форматирование комментариев на самом деле не позволяет мне показывать точные тесты, но я использую текст и разделитель @ Ayman) - так, +1 для @ Ayman's ответ! –

+1

и btw, для полноты, решение на основе RE составляет 2,54 мкс, т. Е. Медленнее, чем у Ayman's или @ Ned. –

0

еще один простой способ использования повторно будет

import re, clr 

text = 'some string... this part will be removed.' 

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1) 

// text = some string 
6

Если вы хотите удалить все после последнего появления разделителя в строке, я считаю, что это хорошо работает:

<separator>.join(string_to_split.split(<separator>)[:-1])

Например, если string_to_split это путь, как root/location/child/too_far.exe и вы хотите только путь к папке, вы можете разделить на "/".join(string_to_split.split("/")[:-1]) и вы получите root/location/child

+0

Кроме того, вы можете изменить этот -1 на любой индекс, являющийся тем случаем, при котором вы удаляете текст. – theannouncer

Смежные вопросы