Encuentra una cadena entre dos subcadenas [duplicado]

Resuelto John Howard asked hace 14 años • 20 respuestas

¿ Cómo encuentro una cadena entre dos subcadenas ( '123STRINGabc' -> 'STRING')?

Mi método actual es el siguiente:

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

Sin embargo, esto parece muy ineficiente y poco pitónico. ¿Cuál es una mejor manera de hacer algo como esto?

Olvidé mencionar: Es posible que la cadena no comience ni termine con starty end. Es posible que tengan más personajes antes y después.

John Howard avatar Jul 30 '10 12:07 John Howard
Aceptado
import re

s = 'asdf=5;iwantthis123jasd'
result = re.search('asdf=5;(.*)123jasd', s)
print(result.group(1))
Nikolaus Gradwohl avatar Jul 30 '2010 05:07 Nikolaus Gradwohl
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" )

da:

123STRING
STRINGabc

Pensé que debería tenerse en cuenta: dependiendo del comportamiento que necesites, puedes combinar indexy rindexrealizar llamadas o optar por una de las versiones anteriores (es equivalente a expresiones regulares (.*)y (.*?)grupos).

cji avatar Jul 30 '2010 05:07 cji
start = 'asdf=5;'
end = '123jasd'
s = 'asdf=5;iwantthis123jasd'
print s[s.find(start)+len(start):s.rfind(end)]

da

iwantthis
ansetou avatar Sep 13 '2013 15:09 ansetou
s[len(start):-len(end)]
Tim McNamara avatar Jul 30 '2010 05:07 Tim McNamara