web-dev-qa-db-fra.com

Python - Vérifiez si les derniers caractères d'une chaîne sont des nombres

Fondamentalement, je veux savoir comment je procéderais.

Voici un exemple de chaîne:

string = "hello123"

Je voudrais savoir comment je vérifierais si la chaîne se termine par un nombre, puis j'imprime le nombre auquel la chaîne se termine.

Je sais que pour cette certaine chaîne, vous pouvez utiliser l'expression régulière pour déterminer si elle se termine par un nombre, puis utilisez la chaîne [:] pour sélectionner "123". MAIS si je boucle un fichier avec des chaînes comme ceci:

hello123
hello12324
hello12435436346

... Ensuite, je ne pourrai pas sélectionner le nombre à l'aide de la chaîne [:] en raison de la différenciation des longueurs de nombre. J'espère avoir expliqué assez clairement ce dont j'ai besoin pour que vous puissiez m'aider. Merci!

32
user2002290
import re
m = re.search(r'\d+$', string)
# if the string ends in digits m will be a Match object, or None otherwise.
if m is not None:
    print m.group()

\d correspond à un chiffre numérique, \d+ signifie correspondre à un ou plusieurs chiffres (gourmand: correspondre à autant de chiffres consécutifs que possible). Et $ signifie correspondre à la fin de la chaîne.

50
Peter Graham

Cela ne représente rien au milieu de la chaîne, mais cela dit essentiellement que si le dernier nombre est un chiffre, il se termine par un nombre.

In [4]: s = "hello123"

In [5]: s[-1].isdigit()
Out[5]: True

Avec quelques cordes:

In [7]: for s in ['hello12324', 'hello', 'hello1345252525', 'goodbye']:
   ...:     print s, s[-1].isdigit()
   ...:     
hello12324 True
hello False
hello1345252525 True
goodbye False

Je soutiens pleinement et complètement la ou les solutions regex, mais voici une (pas jolie) façon d'obtenir le numéro. Encore une fois, l'expression régulière est bien meilleure ici :)

In [43]: from itertools import takewhile

In [44]: s = '12hello123558'

In [45]: r = s[-1::-1]

In [46]: d = [c.isdigit() for c in r]

In [47]: ''.join((i[0] for i in takewhile(lambda (x, y): y, Zip(r, d))))[-1::-1]
Out[47]: '123558'
20
RocketDonkey

Une autre solution: voyez combien de 0-9 chiffres vous pouvez retirer de la fin de chaîne et utilisez cette longueur comme index dans chaîne pour diviser le nombre. (Retour '' au cas où chaîne ne se termine pas par un nombre).

In [1]: s = '12hello123558'

In [2]: s[len(s.rstrip('0123456789')):]
Out[2]: '123558'
4
Hans Bouwmeester

Celui-ci retournera simplement une chaîne vide si la chaîne se termine par quelque chose qui n'est pas un nombre.

import re
re.split('[^\d]', str)[-1]

Puisqu'une chaîne vide est falsy, vous pouvez surcharger la signification:

def getNumericTail(str):
    re.split('[^\d]', str)[-1]

def endsWithNumber(str):
    bool(getNumericTail(str))
1
kojiro

une autre solution:

a = "abc1323"
b = ""
for c in a[::-1]:
    try:
        b += str(int(c))
    except: 
        break

print b[::-1]
0
Thai Tran