How do I get a substring of a string in Python?

PythonStringSubstring

Python Problem Overview


I want to get a new string from the third character to the end of the string, e.g. myString[2:end]. If omitting the second part means 'till the end', and if you omit the first part, does it start from the start?

Python Solutions


Solution 1 - Python

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

Solution 2 - Python

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.

Solution 3 - Python

Substr() normally (i.e. PHP and Perl) works this way:

s = Substr(s, beginning, LENGTH)

So the parameters are beginning and LENGTH.

But Python's behaviour is different; it expects beginning and one after END (!). This is difficult to spot by beginners. So the correct replacement for Substr(s, beginning, LENGTH) is

s = s[ beginning : beginning + LENGTH]

Solution 4 - Python

A common way to achieve this is by string slicing.

MyString[a:b] gives you a substring from index a to (b - 1).

Solution 5 - Python

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 syntax used for no obvious reason.

Solution 6 - Python

> 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, or bind, the name,end, to constant singleton, 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'

I explain slice notation in great detail in my answer to Explain slice notation Question.

Solution 7 - Python

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

new_sub_string = myString[2:]

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

Solution 8 - Python

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'
    

Solution 9 - Python

If myString contains an account number that begins at offset 6 and has length 9, then you can extract the account number this way: acct = myString[6:][:9].

If the OP accepts that, they might want to try, in an experimental fashion,

myString[2:][:999999]

It works - no error is raised, and no default 'string padding' occurs.

Solution 10 - Python

Well, I got a situation where I needed to translate a PHP script to Python, and it had many usages of substr(string, beginning, LENGTH).
If I chose Python's string[beginning:end] I'd have to calculate a lot of end indexes, so the easier way was to use string[beginning:][:length], it saved me a lot of trouble.

Solution 11 - Python

str1='There you are'
>>> str1[:]
'There you are'

>>> str1[1:]
'here you are'

#To print alternate characters skipping one element in between

>>> str1[::2]
'Teeyuae'

#To print last element of last two elements
>>> str1[:-2:-1]
'e'

#Similarly
>>> str1[:-2:-1]
'e'


#Using slice datatype

>>> str1='There you are'
>>> s1=slice(2,6)
>>> str1[s1]
'ere '


Solution 12 - Python

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]
 ' '

Solution 13 - Python

Using hardcoded 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

Using slice you gain readability.

Solution 14 - Python

text = "StackOverflow"
#using python slicing, you can get different subsets of the above string

#reverse of the string
text[::-1] # 'wolfrevOkcatS' 

#fist five characters
text[:5] # Stack'

#last five characters
text[-5:] # 'rflow'

#3rd character to the fifth character
text[2:5] # 'rflow'

#characters at even positions
text[1::2] # 'tcOefo'

Solution 15 - Python

a="Helloo"
print(a[:-1])

In the above code, [:-1] declares to print from the starting till the maximum limit-1.

OUTPUT :

>>> Hello

> Note: Here a [:-1] is also the same as a [0:-1] and a [0:len(a)-1]

a="I Am Siva"
print(a[2:])

OUTPUT:

>>> Am Siva

In the above code a [2:] declares to print a from index 2 till the last element.

> Remember that if you set the maximum limit to print a string, as (x) then it will print the string till (x-1) and also remember that the index of a list or string will always start from 0.

Solution 16 - Python

I have a simpler solution using for loop to find a given substring in a string. Let's say we have two string variables,

main_string = "lullaby"
match_string = "ll"

If you want to check whether the given match string exists in the main string, you can do this,

match_string_len = len(match_string)
for index,value in enumerate(main_string):
    sub_string = main_string[index:match_string_len+index]
    if sub_string == match_string:
       print("match string found in main string")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoan VengeView Question on Stackoverflow
Solution 1 - PythonPaolo BergantinoView Answer on Stackoverflow
Solution 2 - PythonEndophageView Answer on Stackoverflow
Solution 3 - PythonMichał LeonView Answer on Stackoverflow
Solution 4 - PythoncodingscientistView Answer on Stackoverflow
Solution 5 - PythongimelView Answer on Stackoverflow
Solution 6 - PythonRussia Must Remove PutinView Answer on Stackoverflow
Solution 7 - PythonbouvardView Answer on Stackoverflow
Solution 8 - PythonostrokachView Answer on Stackoverflow
Solution 9 - PythonCopyPasteItView Answer on Stackoverflow
Solution 10 - PythonEdson Horacio JuniorView Answer on Stackoverflow
Solution 11 - PythonHarshView Answer on Stackoverflow
Solution 12 - PythonRudi UhlView Answer on Stackoverflow
Solution 13 - PythonleviView Answer on Stackoverflow
Solution 14 - Pythonuser18475123View Answer on Stackoverflow
Solution 15 - PythonCode CarbonateView Answer on Stackoverflow
Solution 16 - PythonkannappanView Answer on Stackoverflow