Is there a way to substring a string in Python?

0 votes
asked Mar 19, 2009 by joan-venge

Is there a way to substring a string in Python, to get a new string from the 3rd character to the end of the string?

Maybe like myString[2:end]?

If leaving the second part means 'till the end', if you leave the first part, does it start from the start?

10 Answers

0 votes
answered Mar 19, 2009 by paolo-bergantino
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python calls this concept "slicing" and it works on more than just strings. Take a look here for a comprehensive introduction.

0 votes
answered Mar 19, 2009 by bouvard

You've got it right there except for "end". Its called slice notation. Your example should read.

new_sub_string = myString[2:]

If you leave out the second param it is implicitly the end of the string.

0 votes
answered Mar 19, 2009 by gimel

One example seems to be missing here: full (shallow) copy.

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>> 

This is a common idiom for creating a copy of sequence types (not of interned strings). [:] Shallow copies a list, See python-list-slice-used-for-no-obvious-reason.

0 votes
answered Mar 2, 2012 by codingscientist

A common way to achieve this is by String slicing. MyString[a:b] gives you a substring from index a to (b - 1)

0 votes
answered Mar 20, 2012 by endophage

Just for completeness as nobody else has mentioned it. The third parameter to an array slice is a step. So reversing a string is as simple as:

some_string[::-1]

Or selecting alternate characters would be:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

The ability to step forwards and backwards through the string maintains consistency with being able to array slice from the start or end.

0 votes
answered Mar 18, 2015 by rudi-uhl

Maybe I missed it, but I couldn't find a complete answer on this page to the original question(s) because variables are not further discussed here. So I had to go on searching.

Since I'm not yet allowed to comment, let me add my conclusion here. I'm sure I was not the only one interested in it when accessing this page:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

If you leave the first part, you get

 >>>myString[:end]
 'Hello' 

And if you left the : in the middle as well you got the simplest substring, which would be the 5th character (count starting with 0, so it's the blank in this case):

 >>>myString[end]
 ' '
0 votes
answered Jan 31, 2016 by ostrokach

I would like to add two points to the discussion:

  1. You can use None instead on an empty space to specify "from the start" or "to the end":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    

    This is particularly helpful in functions, where you can't provide an empty space as an argument:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
    
  2. Python has slice objects:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    
0 votes
answered Jan 31, 2016 by levi

No one mention about using hardcode indexes itself can be a mess.

In order to avoid that, python offers a built-in object slice().

string = "my company has 1000$ on profit, but I lost 500$ gambling."

If we want to know how many money I got left.

Normal solution:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Using slices:

EARNINGS = slice(15,19)
LOSSES = slice(43,46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

You can notice using slice you gain readability

0 votes
answered Sep 15, 2017 by bishop

I believe this is what you're looking for.

>>> s = 'Python'
>>> s = s[2:]
>>> print(s)
>>> 'thon'

When you want to substring everything after index 2 (including 2), you just use : and nothing else. Hope that helps!

0 votes
answered Sep 15, 2017 by aaron-hall

Is there a way to substring a string in Python, to get a new string from the 3rd character to the end of the string?

Maybe like myString[2:end]?

Yes this actually works if you assign end to None:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Slice notation has 3 important arguments:

  • start
  • stop
  • step

Their defaults when not given are None - but we can pass them explicitly:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

If leaving the second part means 'till the end', if you leave the first part, does it start from the start?

Yes, for example:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Note that we include start in the slice, but we only go up to, and not including, stop.

When step is None, by default the slice uses 1 for the step. If you step with a negative integer, Python is smart enough to go from the end to the beginning.

>>> myString[::-1]
'0987654321'
Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter

...