Find string between two substrings [duplicate]

Posted on

Question :

Find string between two substrings [duplicate]

How do I find a string between two substrings ('123STRINGabc' -> 'STRING')?

My current method is like this:

>>> start = 'asdf=5;'
>>> end = '123jasd'
>>> s = 'asdf=5;iwantthis123jasd'
>>> print((s.split(start))[1].split(end)[0])
iwantthis

However, this seems very inefficient and un-pythonic. What is a better way to do something like this?

Forgot to mention:
The string might not start and end with start and end. They may have more characters before and after.

Answer #1:

import re

s = 'asdf=5;iwantthis123jasd'
result = re.search('asdf=5;(.*)123jasd', s)
print(result.group(1))
Answered By: John Howard

Answer #2:

s = "123123STRINGabcabc"

def find_between( s, first, last ):
    try:
        start = s.index( first ) + len( first )
        end = s.index( last, start )
        return s[start:end]
    except ValueError:
        return ""

def find_between_r( s, first, last ):
    try:
        start = s.rindex( first ) + len( first )
        end = s.rindex( last, start )
        return s[start:end]
    except ValueError:
        return ""


print find_between( s, "123", "abc" )
print find_between_r( s, "123", "abc" )

gives:

123STRING
STRINGabc

I thought it should be noted – depending on what behavior you need, you can mix index and rindex calls or go with one of the above versions (it’s equivalent of regex (.*) and (.*?) groups).

Answered By: Nikolaus Gradwohl

Answer #3:

start = 'asdf=5;'
end = '123jasd'
s = 'asdf=5;iwantthis123jasd'
print s[s.find(start)+len(start):s.rfind(end)]

gives

iwantthis
Answered By: cji

Answer #4:

s[len(start):-len(end)]
Answered By: ansetou

Answer #5:

String formatting adds some flexibility to what Nikolaus Gradwohl suggested. start and end can now be amended as desired.

import re

s = 'asdf=5;iwantthis123jasd'
start = 'asdf=5;'
end = '123jasd'

result = re.search('%s(.*)%s' % (start, end), s).group(1)
print(result)
Answered By: Tim McNamara

Answer #6:

If you don’t want to import anything, try the string method .index():

text = 'I want to find a string between two substrings'
left = 'find a '
right = 'between two'

# Output: 'string'
print(text[text.index(left)+len(left):text.index(right)])
Answered By: Tim McNamara

Answer #7:

Just converting the OP’s own solution into an answer:

def find_between(s, start, end):
  return (s.split(start))[1].split(end)[0]
Answered By: Fernando Wittmann

Answer #8:

Here is one way to do it

_,_,rest = s.partition(start)
result,_,_ = rest.partition(end)
print result

Another way using regexp

import re
print re.findall(re.escape(start)+"(.*)"+re.escape(end),s)[0]

or

print re.search(re.escape(start)+"(.*)"+re.escape(end),s).group(1)
Answered By: reubano

Leave a Reply

Your email address will not be published. Required fields are marked *