J'ai un code python simple qui recherche dans les fichiers une chaîne, par exemple path=c:\path
, où la c:\path
partie peut varier. Le code actuel est:
def find_path(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 le moyen simple d'obtenir le texte après Path=
?
Réponses:
À partir de
Python 3.9
, vous pouvez utiliserremoveprefix
:la source
Si la chaîne est fixe, vous pouvez simplement utiliser:
qui vous donne tout à partir de la position 5 dans 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 début
=
:Alors param est "Path" et value est le reste après le premier =.
la source
split
lance une exception si le délimiteur n'est pas présent.partition
est plus stable, il divise également une chaîne et retourne toujours un tuple à trois éléments avec pré-, délimiteur et post-contenu (dont certains peuvent l'être''
si le délimiteur n'était pas présent). Par exemple,value = line.partition('=')
.Supprimer le préfixe d'une chaîne
Fractionner à la première occurrence du séparateur via
str.partition()
Analyser un fichier de type INI avec ConfigParser
Autres options
str.split()
re.match()
la source
la source
Pour le tranchage (conditionnel ou non conditionnel) en général, je préfère ce qu'un collègue a suggéré récemment; Utilisez le remplacement par une chaîne vide. Plus facile à lire le code, moins de code (parfois) et moins de risque de spécifier le mauvais nombre de caractères. D'accord; Je n'utilise pas Python, mais dans d'autres langages, je préfère cette approche:
ou - pour donner suite au premier commentaire de cet article - si cela ne doit être fait que si la ligne commence par
Path
:La principale différence avec certains de ce qui a été suggéré ci-dessus est qu'il n'y a pas de "nombre magique" (5) impliqué, ni aucun besoin de spécifier à la fois '
5
' et la chaîne 'Path=
', En d'autres termes, je préfère cette approche à une maintenance de code point de vue.la source
rightmost = re.sub('^Path=', '', fullPath)
. Le but de lacompile()
méthode est d'accélérer les choses si vous réutilisez l'objet compilé, mais puisque vous le jetez après l'avoir utilisé, cela n'a aucun effet ici de toute façon. De toute façon, cela ne vaut généralement pas la peine de s'inquiéter de cette optimisation.Je préfère
pop
indexer[-1]
:à
la source
startswith
a déjà été testé, doncsplit
ne divisera «rien» avant et tout le reste après.split("Path=", 1)
est plus précis (en cas de réapparition du préfixe plus tard dans la chaîne) mais réintroduit un nombre magique.Ou pourquoi pas
la source
Que diriez-vous..
Ce triplet est la tête, le séparateur et la queue .
la source
Le moyen le plus simple auquel je puisse penser est le tranchage:
Une note rapide sur la notation des tranches, il utilise deux indices au lieu de l'habituel. Le premier index indique le premier élément de la séquence que vous souhaitez inclure dans la tranche et le dernier index est l'index immédiatement après le dernier élément que vous souhaitez inclure dans la tranche.
Par exemple:
La tranche se compose de tous les éléments entre
first_index
etlast_index
, y comprisfirst_index
et nonlast_index
. Si le premier index est omis, il prend par défaut le début de la séquence. Si le dernier index est omis, il inclut tous les éléments jusqu'au dernier élément de la séquence. Les indices négatifs sont également autorisés. Utilisez Google pour en savoir plus sur le sujet.la source
la source
r''
chaînes pour les chemins Windows. 2.re.match()
peut retourner NoneUn autre simple one-liner qui n'a pas été mentionné ici:
Cela fonctionnera également correctement pour divers cas extrêmes:
la source
vous donne des caractères après les cinq premiers.
la source
line[5:]
donnera la sous-chaîne souhaitée. Recherchez l' introduction et recherchez la `` notation de tranche ''la source
Si vous connaissez la compréhension des listes:
la source
line.startswith(...)
est 10 fois plus rapide. Mes tests ne l'ont pas confirmé. Heureux de le changer si des preuves étayant cette affirmation sont fournies.La version pop n'était pas tout à fait correcte. Je pense que tu veux:
la source
Pourquoi ne pas utiliser regex avec escape?
^
correspond à la partie initiale d'une ligne etre.MULTILINE
correspond à chaque ligne.re.escape
garantit que la correspondance est exacte.la source
Essayez le code suivant
la source
Je suppose que c'est exactement ce que tu cherches
la source
sans avoir à écrire une fonction, cela sera divisé en fonction de la liste, dans ce cas «M. | Dr. | Mme.», sélectionnez tout après la séparation avec [1], puis divisez à nouveau et prenez n'importe quel élément. Dans le cas ci-dessous, «Morris» est renvoyé.
la source
Cette technique est très similaire à celle des autres réponses, mais sans opérations répétées sur les chaînes, possibilité de dire si le préfixe était là ou non, et toujours assez lisible:
la source