Как удалить все символы после определенного символа в python?

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


person Solihull    schedule 24.05.2009    source источник
comment
Если вы не уверены, что это имеет смысл, обновите свой вопрос, чтобы предоставить конкретные примеры того, что вы хотите сделать.   -  person S.Lott    schedule 25.05.2009


Ответы (10)


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

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

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

person Ned Batchelder    schedule 24.05.2009
comment
Запрос состоит в том, чтобы удалить весь текст после разделителя, а не получить этот текст, поэтому я думаю, что вы хотите [0], а не [-1], в вашем отличном решении. - person Alex Martelli; 25.05.2009
comment
Сработало отлично, спасибо, как и у Аймана и Алекса, так что всем спасибо. - person Solihull; 25.05.2009
comment
Используйте rsplit(), если вам нужно разделить по символу, начиная с конца строки. - person Samuel; 16.12.2014
comment
rsplit() фактически отвечает на вопрос, есть ли несколько вхождений разделителя - person Nate; 01.05.2015

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

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

>>> print head
some string

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

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

partition(...) S.partition(sep) -> (head, sep, tail)

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.
person Ayman Hourieh    schedule 24.05.2009
comment
Еще одно отличное решение - не нарушаем ли мы TOOOWTDI?-) Возможно, стоит запустить его, чтобы проверить... - person Alex Martelli; 25.05.2009
comment
.partition выигрывает — 0,756 мкс на цикл против 1,13 для .split (форматирование комментариев не позволяет мне показать точные тесты, но я использую текст и разделитель @Ayman) — так что +1 за ответ @Ayman ! - person Alex Martelli; 25.05.2009
comment
и кстати, для полноты, решение на основе RE составляет 2,54 мкс, т. е. намного медленнее, чем у @Ayman или @Ned. - person Alex Martelli; 25.05.2009
comment
раздел выигрывает, если вы находитесь в 2,5 земли :) Для нас, лохов, застрявших в 2,4, мы должны жить с относительно ледяной медлительностью разделения. - person Gregg Lind; 27.05.2009
comment
Пример действительно полезен. - person Md. Sabbir Ahmed; 16.10.2019

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

<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.

person theannouncer    schedule 14.09.2015
comment
кроме того, вы можете изменить этот -1 на любой индекс, чтобы он был вхождением, в котором вы отбрасываете текст. - person theannouncer; 15.09.2015

Без 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)
person Alex Martelli    schedule 24.05.2009
comment
Возможно, вы захотите использовать sep='...' в качестве kwarg и использовать len(sep) вместо жесткого кодирования 3, чтобы сделать его более перспективным. - person cdleary; 25.05.2009
comment
Да, но тогда вам нужно перекомпилировать RE при каждом вызове, поэтому производительность решения RE страдает (нет реальной разницы для решения без RE). Что-то бесплатное, что-то нет... ;-) - person Alex Martelli; 25.05.2009
comment
@Alex - Спасибо за тестирование решений! - person Ayman Hourieh; 25.05.2009

import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Вывод: «Это тест»

person Marcus    schedule 26.02.2020
comment
Пожалуйста, объясните - person Foggy Minded Greenhorn; 03.04.2020

Метод find возвращает позицию символа в строке. Затем, если вы хотите удалить все с персонажа, сделайте следующее:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

Если вы хотите сохранить символ, добавьте 1 к позиции символа.

person Eduardo Freitas    schedule 18.06.2020

Из файла:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)
person parikhparth23    schedule 19.03.2020

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

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
person Rohail    schedule 20.05.2015

Это в python 3.7, работающем со мной. В моем случае мне нужно удалить после точки в моих сборах строковых переменных

сборы = 45,05
split_string = сборы.split(., 1)

подстрока = разделенная_строка[0]

печать (подстрока)

person Ganesan J    schedule 03.03.2021

Еще один способ удалить все символы после последнего вхождения символа в строку (предположим, что вы хотите удалить все символы после последнего "/").

path = 'I/only/want/the/containing/directory/not/the/file.txt'

while path[-1] != '/':
    path = path[:-1]
person Arnaldo C    schedule 25.05.2021
comment
Я думаю, что это будет создавать новую копию path на каждой итерации, поэтому это не особенно эффективное решение, хотя я согласен, что оно должно работать. - person joanis; 26.05.2021