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