2016-11-07 1 views
-2

Je rencontre des problèmes pour extraire des nombres d'une chaîne afin de créer un nouveau champ à l'aide de la calculatrice de champs dans ArcGIS. Les valeurs extraites doivent rester sous forme de chaîne. Le problème que j'ai, c'est qu'il n'y a pas de cohérence dans le nombre de caractères qui ont précédé et suivi les chiffres que je souhaite extraire. La seule cohérence dans la chaîne est une virgule qui suit le nombre désiré.For et While Loop pour extraire une partie d'une chaîne

Jusqu'à présent, mon code est le suivant:

def get_num_from_string(string): 
    num = '' 
    for i in string: 
     if i in '1234567890': 
      num+=i 
    return num 

Ce code ne réussit pas à accomplir mon objectif que j'ai besoin du code pour parcourir chaque caractère de la chaîne et le retour des chiffres jusqu'à ce que la virgule est atteinte. Par exemple si la chaîne d'origine est "River Lot 489, 11756 MB CODE", je veux que ma chaîne de sortie indique "489".

+0

Que signifie précisément * "numéros qui suivent ceux qui me sont désirés, me donnant des valeurs incorrectes" * signifie? Donnez un [mcve]. – jonrsharpe

+0

Je ne suis pas sûr de comprendre pourquoi vous pensez qu'une boucle while serait plus appropriée pour parcourir une longueur finie de caractères dans une chaîne –

+0

Désolé, je suis un utilisateur Python débutant alors pardonnez ma naïveté. Ce que je veux dire @ jonrsharpe, c'est qu'il y a des nombres dans les données qui viennent après les nombres que j'essaie d'extraire de l'original. Par exemple: « Lot 489, 127756 MB CODE » Je veux que ma sortie soit simplement « 489 » – Husters

Répondre

1

supposons que vous avez la chaîne

test = "12hel34l0" 

Pour obtenir tous les chiffres dans la chaîne, il suffit de faire

>>>> print([d for d in test if d.isdigit()]) 
['1', '2', '3', '4', '0'] 
>>>> 

Si vous voulez qu'il soit une chaîne à nouveau au lieu d'une liste, utilisez join

>>>> print(''.join([d for d in test if d.isdigit()])) 
12340 
>>>> 

Modifier:

"Lot 489, 127756 MB CODE" Je veux que ma sortie soit simplement "489"

Pour correspondre, je change simplement la méthode suivante pour test.split(",")[0]. Vous devez fournir plus d'informations à quoi ressemblent vos données et si vous souhaitez obtenir les chiffres avant la première virgule à chaque fois.

Implémenté dans votre méthode.

def get_num_from_string(string): 
    return ''.join([d for d in test.split(",")[0] if d.isdigit()]) 

Tester votre exemple fourni

>>>> test = "River Lot 489, 127756 MB CODE" 
>>>> print(get_num_from_string(test)) 
489