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!
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.
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'
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))
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'
Une autre solution:
a = "abc1323"
b = ""
for c in a[::-1]:
try:
b += str(int(c))
except:
break
print b[::-1]