Як видалити всі символи після певного символу в 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.