Как удалить все символы после определенного символа в 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.