2010-08-14 47 views
2

Plongez dans python donne un petit tutoriel étonnant sur la création d'une expression régulière pour les numéros de téléphone: http://diveintopython3.ep.io/regular-expressions.html#phonenumbersNuméro de téléphone Expression régulière (Regex) en Python

La version finale sort pour ressembler à:

phone_re = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$', re.VERBOSE) 

Cela fonctionne bien pour presque tous les exemples que je peux trouver, mais j'ai trouvé un très gros échec que je n'arrive pas à résoudre.

Si un groupe de 3 chiffres précède le numéro de téléphone, cela fonctionne correctement. IE: "500 dollars de réduction, appelez le 123-456-7891"

Si un groupe de 3 chiffres vient après le numéro de téléphone, il échoue. IE: "Appelez le 123-456-7891 pour un rabais allant jusqu'à 500"

Des idées sur un correctif qui fonctionneraient pour les deux exemples?

+6

Je suis toujours étonné de constater à quel point les personnes respectées de la communauté Web donnent des conseils erronés (c'est-à-dire centrés sur les États-Unis). Cela peut être un bon exemple académique pour donner à regex un sens pratique pour les débutants, mais vous ne devriez pas l'utiliser dans une application réelle. Les numéros de téléphone ne fonctionnent pas de la même manière partout dans le monde. – Tomalak

+0

Plus précisément, vous ne devez l'utiliser dans une application que si vous ne prévoyez jamais d'utiliser votre application ailleurs qu'aux États-Unis. – Amber

+4

Et même pas là, car tout le monde ne peut pas formater un numéro de téléphone comme ils le devraient. – Joey

Répondre

1

Le code (\d*)$ requiert que la chaîne que vous comparez se termine par un caractère (le $ signifie "fin de ligne"). Essayez de supprimer le code $ si vous faites une correspondance avec une chaîne plus grande dans laquelle le numéro de téléphone peut ne pas figurer à la fin de la ligne.

0

Voici votre original, avec quelques espaces (utilisez re.VERBOSE, ou supprimer les espaces):

(\d{3}) \D* (\d{3}) \D* (\d{4}) \D* (\d*) 

Le \D* va correspondre à quelque chose qui est pas un chiffre, y compris les mots. Peut-être vous devriez essayer ceci:

(\d{3}) \W* (\d{3}) \W* (\d{4}) \W* (\d*) 

Le \W* correspond à tout ce qui est pas un mot. Il va correspondre (222) - 222 - 2222. Cependant, il ne correspondra pas s'il y a une lettre entre les nombres, comme dans (222) x 222 - 2222. La dernière partie du match (\d*) semble chercher une extension. Ceux-ci peuvent être formatés de plusieurs façons. — Je vous suggère de le laisser tomber ou de l'affiner en fonction de l'apparence de vos données. Et, comme dit Amber, vous devriez probablement laisser tomber le $.

Questions connexes