J'ai une chaîne comme échantillon 1: p> échantillon 2: p> "goto: 7018 6453 12654 \ n" code> Je veux juste obtenir le numéro quelque chose comme ça ['7018', '6453', '12654'] < / Code>, je tente une expression régulière mais je ne peux pas scinder la chaîne pour obtenir juste numéro ici est mon code:
5 Réponses :
Si tous vos chiffres sont des entiers positifs, vous pouvez le faire sans expressions régulières en utilisant le isdigit () Méthode:
>>> text = "GoTo: 7018 6453 12654\n" >>> [token for token in text.split() if token.isdigit()] ['7018', '6453', '12654']
+1 pour non-re. On pourrait facilement lancer int (item) code> là aussi, si cela était nécessaire plus tard.
Est-ce que certains Timeit code> ... Si Split + ISDigit est la valeur de base (c'est le plus rapide), compilé Re.Findall est 1,5 fois plus lent et sans réserve Re.Findall 2.5.
Cela ne fonctionne que si le séparateur est pur blanc (par exemple, même "1, 2, 3" le casserait)
@ 6502, True, mais vous pouvez spécifier le séparateur dans le premier argument à Split () Code> S'il n'y a pas de pure espace.
Il s'agit de la façon dont vous lisez le problème. Par "J'ai une corde comme" Je suppose que ce n'était pas sage d'assumer une signification trop stricte pour "comme", donc à mon avis, les séparateurs sont tout sauf ("Je veux juste obtenir le numéro") et diviser peut 't le faire ... cela rend le problème un travail pour re. Apparemment, toutefois n'utilise pas Re est un plus pour des raisons pour des raisons que je ne comprends pas ... Et maintenant, nous avons eu un programmeur de python anoter Wannabe qui écrira un mauvais code fragile au lieu d'apprendre à utiliser un regexp.
@ 6502, il y a un ancien dicton qui va: certaines personnes, Lorsqu'il est confronté à un problème, pensez-vous "je sais, je vais utiliser des expressions régulières." Maintenant, ils ont deux problèmes. Code> d'accord, sérieusement, c'est juste une question de performance par rapport aux exigences, je n'ai rien contre des regexes en soi i> :)
Alors que je suis un peu d'accord avec un tel dicton pour XML, je n'ai personnellement jamais eu un tel sentiment à propos de Regexp malgré beaucoup d'avoir beaucoup utilisé (y compris écrire un moteur Regeuxp moi). Le point de vitesse est assez faible et a même été montré par ce ré-antiboy après avoir attribué un point de ne pas utiliser Regexp. Je vois quelqu'un (l'affiche originale) qui a abandonné la solution correcte (RE) pour des raisons stupides (il utilisait simplement Split au lieu de retrouver) et renoncera probablement à étudier les expressions grâce au débordement de la pile. Et je me sens un peu triste à ce sujet ...
>>> import re
>>> re.findall("[0-9]+", "GoTo: 7018 6453 12654\n")
['7018', '6453', '12654']
>>>
>>> re.findall(r'\d+', 'GoTo: 7018 6453 12654\n') ['7018', '6453', '12654']
Vous pouvez suivre votre méthode actuelle dans l'exemple 1 avec ce code:
filter (lambda a: a != '', match1)
Essayez ceci:
import re
splitter = re.compile(r'\d+')
match1 = splitter.findall("GoTo: 7018 6453 12654\n")
print match1