web-dev-qa-db-fra.com

Python - Le moyen le plus élégant d'extraire une sous-chaîne, étant donné les bords gauche et droit

J'ai une chaîne - Python:

string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"

La sortie attendue est:

"Atlantis-GPS-coordinates"

Je sais que la sortie attendue est TOUJOURS entourée de "/ bar /" à gauche et de "/" à droite:

"/bar/Atlantis-GPS-coordinates/"

La solution proposée ressemblerait à ceci:

a = string.find("/bar/")
b = string.find("/",a+5)
output=string[a+5,b]

Cela fonctionne, mais je n'aime pas cela. Quelqu'un connaît-il une belle fonction ou un bon conseil?

6
Vincent

Vous pouvez utiliser split :

>>> string.split("/bar/")[1].split("/")[0]
'Atlantis-GPS-coordinates'

Une certaine efficacité de l'ajout d'une division maximale de 1 je suppose:

>>> string.split("/bar/", 1)[1].split("/", 1)[0]
'Atlantis-GPS-coordinates'

Ou utilisez partition :

>>> string.partition("/bar/")[2].partition("/")[0]
'Atlantis-GPS-coordinates'

Ou une regex:

>>> re.search(r'/bar/([^/]+)', string).group(1)
'Atlantis-GPS-coordinates'

Cela dépend de ce qui vous parle et de vos données.

9
dawg

Ce que tu n'as pas fait n'est pas si terrible. Je l'écrirais comme:

start = string.find('/bar/') + 5
end = string.find('/', start)
output = string[start:end]

tant que vous savez que /bar/WHAT-YOU-WANT/ sera toujours présent. Sinon, je prendrais le couteau à expression régulière :

>>> import re
>>> PATTERN = re.compile('^.*/bar/([^/]*)/.*$')
>>> s = '/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/'
>>> match = PATTERN.match(s)
>>> match.group(1)
'Atlantis-GPS-coordinates'
3
D.Shawley
import re

pattern = '(?<=/bar/).+?/'
string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"

result = re.search(pattern, string)
print string[result.start():result.end() - 1]
# "Atlantis-GPS-coordinates" 

C’est un exemple Python 2.x. Ce qu’il fait en premier lieu est: 1. (? <=/bar /) signifie que ne traitez la regex suivante que si elle la précède (de sorte que/bar/doit être avant) 2. '. +? /' signifie n'importe quel nombre de caractères jusqu'au prochain caractère '/'

J'espère que ça aide certains.

Si vous devez effectuer ce type de recherche, il est préférable de "compiler" cette recherche de performances, mais si vous ne devez le faire qu'une fois, ne vous embêtez pas.

1
saltycraig

Utilisation de re (plus lente que les autres solutions):

>>> import re
>>> string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/"
>>> re.search(r'(?<=/bar/)[^/]+(?=/)', string).group()
'Atlantis-GPS-coordinates'
0
heemayl