Як видалити всі символи після певного символу в python?


148

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


6
Якщо ви не впевнені, що це має сенс, то оновіть своє запитання, щоб надати конкретні приклади того, що ви хочете зробити.
S.Lott

Відповіді:


259

Розділіть на своєму сепараторі не пізніше і візьміть перший шматок:

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

Ви не сказали, що має статися, якщо роздільника немає. І це, і рішення Алекса повернуть всю нитку в цьому випадку.


Запит - "видалити весь текст після" роздільника, а не "дістати" цей текст, тому я думаю, що ви хочете [0], а не [-1], у вашому інакше відмінному рішенні.
Алекс Мартеллі

Дуже добре працював, так як я впевнений, що це зробили і Ayman & Alex, тому всім дякую.
Соліхул

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 (sep) -> (голова, sep, хвіст)

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
.частина виграє - 0,756 Usec за цикл, проти 1,13 для .split (форматування коментарів насправді не дозволяє мені показувати точні тести, але я використовую текст і роздільник @ Ayman) - так, +1 для відповіді @ Ayman !
Алекс Мартеллі

1
і для досконалості рішення, засноване на RE, становить 2,54 Usec, тобто шлях повільніше, ніж у @ 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 на будь-який індекс, щоб це було випадком, коли ви кидаєте текст.
theannouncer

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, щоб зробити його трохи більш надійним.
cdleary

Так, але тоді вам потрібно перекомпілювати RE на кожному виклику, тому продуктивність для рішення RE страждає (продуктивність не має рішення). Деякі загальні риси безкоштовні, деякі ні ... ;-)
Алекс Мартеллі,

@Alex - Дякуємо за тестування рішень!
Айман Х’юрі

2

Пошук методу поверне позицію символу в рядку. Потім, якщо ви хочете видалити кожну річ із персонажа, зробіть це:

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

Ще один простий спосіб використання 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.