236

I have a string. How do I remove all text after a certain character? (In this case ...)
The text after will ... change so I that's why I want to remove all characters after a certain one.

wjandrea
  • 28,235
  • 9
  • 60
  • 81
Solihull
  • 6,779
  • 5
  • 22
  • 12

11 Answers11

392

Split on your separator at most once, and take the first piece:

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

You didn't say what should happen if the separator isn't present. Both this and Alex's solution will return the entire string in that case.

wjandrea
  • 28,235
  • 9
  • 60
  • 81
Ned Batchelder
  • 364,293
  • 75
  • 561
  • 662
  • Request is "remove all the text after" the separator, not "get" that text, so I think you want [0], not [-1], in your otherwise excellent solution. – Alex Martelli May 24 '09 at 22:09
  • Worked perfectly thanks, as I'm sure Ayman & Alex's did as well, so thank you all. – Solihull May 24 '09 at 22:51
  • 15
    Use rsplit() if you need to split by a character starting from the end of the string. – Samuel Dec 16 '14 at 00:03
  • rsplit() actually answers the question if there are multiple occurrences of the separator – Nate May 01 '15 at 15:49
134

Assuming your separator is '...', but it can be any string.

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

>>> print head
some string

If the separator is not found, head will contain all of the original string.

The partition function was added in Python 2.5.

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.

wjandrea
  • 28,235
  • 9
  • 60
  • 81
Ayman Hourieh
  • 132,184
  • 23
  • 144
  • 116
30

If you want to remove everything after the last occurrence of separator in a string I find this works well:

<separator>.join(string_to_split.split(<separator>)[:-1])

For example, if string_to_split is a path like root/location/child/too_far.exe and you only want the folder path, you can split by "/".join(string_to_split.split("/")[:-1]) and you'll get root/location/child

theannouncer
  • 1,148
  • 16
  • 28
11

Without a regular expression (which I assume is what you want):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

or, with a regular expression:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)
wjandrea
  • 28,235
  • 9
  • 60
  • 81
Alex Martelli
  • 854,459
  • 170
  • 1,222
  • 1,395
  • Might want to use sep='...' as a kwarg and use len(sep) instead of hard-coding the 3 to make it slightly more future-proof. – cdleary May 24 '09 at 22:49
  • Yep, but then you need to recompile the RE on each call, so performance suffers for the RE solution (no real difference for the non-RE solution). Some generality is free, some isn't...;-) – Alex Martelli May 24 '09 at 22:56
  • @Alex - Thanks for testing the solutions! – Ayman Hourieh May 24 '09 at 23:09
6
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Output: "This is a test"

Marcus
  • 69
  • 1
  • 4
4

The method find will return the character position in a string. Then, if you want remove every thing from the character, do this:

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

>> '123'

If you want to keep the character, add 1 to the character position.

Eduardo Freitas
  • 941
  • 8
  • 6
3

From a file:

import re
sep = '...'

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

This is in python 3.7 working to me In my case I need to remove after dot in my string variable fees

fees = 45.05
split_string = fees.split(".", 1)

substring = split_string[0]

print(substring)

Ganesan J
  • 539
  • 7
  • 12
0

Yet another way to remove all characters after the last occurrence of a character in a string (assume that you want to remove all characters after the final '/').

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

while path[-1] != '/':
    path = path[:-1]
Arnaldo C
  • 13
  • 2
  • I think this will create a new copy of `path` at each iteration, so it's not a particularly efficient solution, although I agree it should work. – joanis May 26 '21 at 02:27
0

Oneliner for in-place replacement:

text, *_ = text.partition('...')

Credits to original answer: https://stackoverflow.com/a/904758/5726546

Sigmatics
  • 615
  • 4
  • 17
-1

another easy way using re will be

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
Baris Demiray
  • 1,539
  • 24
  • 35
Rohail
  • 1
  • 1