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.
11 Answers
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.

- 28,235
- 9
- 60
- 81

- 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
-
15Use 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
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.

- 28,235
- 9
- 60
- 81

- 132,184
- 23
- 144
- 116
-
Yet another excellent solution -- are we violating TOOOWTDI?-) Maybe worth a timeit run to check... – Alex Martelli May 24 '09 at 22:11
-
9.partition wins -- 0.756 usec per loop, vs 1.13 for .split (comment formatting doesn't really let me show the exact tests, but I'm using @Ayman's text and separator) -- so, +1 for @Ayman's answer! – Alex Martelli May 24 '09 at 22:15
-
1and btw, for completeness, the RE-based solution is 2.54 usec, i.e., way slower than either @Ayman's or @Ned's. – Alex Martelli May 24 '09 at 22:58
-
partition wins if you're in 2.5 land :) For us suckers stuck in 2.4, we have to live with relatively glacial slowness of split. – Gregg Lind May 27 '09 at 16:15
-
-
Small improvement, you can simply discard the other values if you don't need them: ```head, *_ = text.partition('...') ``` – Sigmatics Mar 27 '23 at 15:13
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

- 1,148
- 16
- 28
-
1additionally, you can change that -1 to any index to be the occurrence at which you drop text. – theannouncer Sep 14 '15 at 22:19
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)

- 28,235
- 9
- 60
- 81

- 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
-
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"

- 69
- 1
- 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.

- 941
- 8
- 6
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)

- 371
- 2
- 19
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)

- 539
- 7
- 12
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]

- 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
Oneliner for in-place replacement:
text, *_ = text.partition('...')
Credits to original answer: https://stackoverflow.com/a/904758/5726546

- 615
- 4
- 17
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

- 1,539
- 24
- 35

- 1
- 1
-
Regular expressions are difficult because of the shorthand. This might be a useful answer, but you didn't explain any of it. – Joshua Stafford Oct 27 '21 at 18:30