167 votes

Python - comment supprimer la partie gauche d'une chaîne?

J'ai quelques codes python simples qui recherchent une chaîne dans les fichiers, par exemple path=c:\path , les c:\path pouvant varier. Le code actuel est:

 def findPath( i_file) :
  lines = open( i_file ).readlines()
  for line in lines :
    if line.startswith( "Path=" ) :
      return # what to do here in order to get line content after "Path=" ?
 

Quel est un moyen simple d'obtenir un texte de chaîne après Path= ? Existe-t-il une méthode simple, sans fermetures, réflexions ou autres choses ésotériques?

208voto

MrTopf Points 2708

Si la chaîne est corrigée, vous pouvez simplement utiliser:

 if line.startswith("Path="):
    return line[5:]
 

ce qui vous donne tout depuis la position 5 de la chaîne (une chaîne est aussi une séquence, donc ces opérateurs de séquence fonctionnent ici aussi).

Ou vous pouvez diviser la ligne au premier = :

 if "=" in line:
    param, value = line.split("=",1)
 

Alors param est "Path" et la valeur est le reste après le premier =.

132voto

J.F. Sebastian Points 102961

Supprimer le préfixe à partir d'une chaîne

# ...
if line.startswith(prefix):
   return line[len(prefix):]

Split sur la première occurrence du séparateur par str.partition()

def findvar(filename, varname="Path", sep="=") :
    for line in open(filename):
        if line.startswith(varname + sep):
           head, sep_, tail = line.partition(sep) # instead of `str.split()`
           assert head == varname
           assert sep_ == sep
           return tail

Analyser INI file avec ConfigParser

from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read(filename) # requires section headers to be present

path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation

D'autres options

40voto

David Foster Points 693
 def removePrefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text
 

Impossible de résister à cela en une seule ligne. Nécessite Python 2.5+.

21voto

fredarin Points 338

Pour le tranchage (conditionnelle ou non conditionnelle) en général je préfère ce qu'un collègue lui a récemment; l'Utilisation de remplacement avec une chaîne vide. Plus facile à lire le code, moins de code (parfois) et moins de risque de spécifier un nombre de caractères incorrect. Ok; je n'utilisez pas de Python, mais dans d'autres langues que je préfère cette approche:

rightMost = fullPath.replace('Path=','',1)

ou suivre le premier commentaire à ce post si cela devrait être effectué uniquement si la ligne commence avec Path:

rightmost = re.compile('^Path=').sub('',fullPath)

La principale différence de certains de ce qui a été suggéré ci-dessus est qu'il n'y a pas de "nombre magique" (5) impliqués, ni besoin de spécifier à la fois"5' et la chaîne de caractères"Path=', En d'autres termes, je préfère cette approche à partir d'un code de maintenance de point de vue.

15voto

rizumu Points 839

Je préfère les looks pop à l'indexation:

 value = line.split("Path=").pop()
 

à

 value = line.split("Path=")[1]
param, value = line.split("Path=")
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X