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

Fondamentalement, je veux savoir comment je ferais cela.

Voici un exemple de chaîne:

string = "hello123"

Je voudrais savoir comment vérifier si la chaîne se termine par un nombre, puis imprimer le nombre dans lequel la chaîne se termine.

Je sais que pour cette certaine chaîne, vous pouvez utiliser regex pour déterminer si elle se termine par un nombre, puis utiliser string [:] pour sélectionner "123". Mais si je boucle dans un fichier avec des chaînes comme ceci:

hello123
hello12324
hello12435436346

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

29
demandé sur user2002290 2013-01-23 05:46:45

5 réponses

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 consécutifs que possible). Et $ signifie correspondre à la fin de la chaîne.

44
répondu Peter Graham 2016-11-22 16:24:31

Cela ne tient pas compte de quoi que ce soit au milieu de la chaîne, mais il dit fondamentalement 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 chaînes:

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

Je supporte entièrement et complètement la ou les solutions regex, mais voici une (PAS jolie) façon d'obtenir le numéro. Encore une fois, regex est beaucoup mieux 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'
16
répondu RocketDonkey 2013-01-23 02:09:56

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]

Depuis une chaîne vide est falsy, vous pouvez surcharger le sens:

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

def endsWithNumber(str):
    bool(getNumericTail(str))
1
répondu kojiro 2013-01-23 02:04:53

Une autre solution: voyez combien de 0-9 chiffres vous pouvez supprimer la fin de string et utiliser cette longueur comme index dans string pour diviser le nombre. (Retourne '' dans le 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'
1
répondu Hans Bouwmeester 2017-12-17 21:54:16

Une autre solution:

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

print b[::-1]
0
répondu Thai Tran 2013-01-23 01:59:52