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


148

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


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

Ответы:


259

Разделите ваш разделитель не более одного раза и возьмите первый фрагмент:

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

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


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

Отлично сработало, я уверен, что Айман и Алекс тоже, спасибо всем.
Солихалл

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

rsplit () фактически отвечает на вопрос, если разделитель встречается несколько раз
Nate

94

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

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.

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

9
.partition wins - 0,756 usec за цикл, против 1.13 для .split (форматирование комментариев действительно не позволяет мне показывать точные тесты, но я использую текст и разделитель @ Ayman) - так, +1 за ответ @ Ayman !
Алекс Мартелли

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

раздел выигрывает, если вы находитесь на 2,5 земле :) Для нас, лохов, застрявших в 2,4, мы должны жить с относительно ледяной медлительностью раскола.
Грегг Линд

Пример действительно полезен.
Г-жа Саббир Ахмед

18

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

<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


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

10

Без 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)

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

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

@Alex - Спасибо за тестирование решений!
Айман Хуриех

2

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

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

>> '123'

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


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

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


пожалуйста, объясните
lone_coder

1

Из файла:

import re
sep = '...'

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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.