J'essaie de valider un numéro de téléphone portable, ce que j'ai fait jusqu'à présent, mais cela ne semble pas fonctionner.
J'en ai besoin pour soulever une erreur de validation lorsque la valeur passée ne ressemble pas à la valeur. un numéro de mobile. Les numéros mobiles peuvent avoir une longueur de 10 à 14 chiffres, commencez par 0 ou 7, et aurait pu y ajouter 44 ou +44. P>
def validate_mobile(value):
""" Raise a ValidationError if the value looks like a mobile telephone number.
"""
rule = re.compile(r'/^[0-9]{10,14}$/')
if not rule.search(value):
msg = u"Invalid mobile number."
raise ValidationError(msg)
6 Réponses :
J'essaierais quelque chose comme:
re.compile(r'^\+?(44)?(0|7)\d{9,13}$')
Je remplacerais (0 | 7) code> avec [07] code> comme Mikem l'a fait. De plus, il correspondrait aux téléphones comme +0123456789 code> et +7123456789 code>.
La regex suivante correspond à votre description
r'^(?:\+?44)?[07]\d{9,13}$'
Pour préciser, je ne prétends pas que ceci est une bonne validation de téléphone mobile regex, mais que cela correspond à la définition des numéros mobiles dans la question.
Pouvez-vous fournir la regex pour le numéro de mobile standard?
Ceux-ci ne valideront pas +44 numéros au besoin. Suivez def validate_not_mobile(value):
rule = re.compile(r'(^[+0-9]{1,3})*([0-9]{10,11}$)')
if rule.search(value):
msg = u"You cannot add mobile numbers."
raise ValidationError(msg)
@ User7. Parfait? Le ci-dessus validera E.g Gobbledegook99999999999999999999999999999999999999999 / Code>.
@ User7 mikem est correct, mon mauvais. S'il vous plaît voir sa réponse. Mikem, Chill Merci d'avoir souligné l'erreur, mais ne vous obligeez pas que nous sommes ici pour la même chose.
Un ingénieur QA du logiciel se dirige vers un bar. Il ordonne une bière. Il ordonne deux bières. Il commande -1 bières. Il commande 99999999999 Beers. Il ordonne une peinture de Salvador Dali ....
Je recommanderais d'utiliser le Paquet de phonumbers qui est un port python de Google de Google, qui comprend Un ensemble de données de supports mobiles désormais:
import phonenumbers from phonenumbers import carrier from phonenumbers.phonenumberutil import number_type number = "+49 176 1234 5678" carrier._is_mobile(number_type(phonenumbers.parse(number)))
Je ne le recommanderai pas car il ne jette pas une exception lorsqu'un alphabet est rencontré dans la chaîne.
S'il renvoie FALS, n'est-ce pas assez bon? Pour moi, cela a été beaucoup mieux jusqu'à présent.
Selon Pep8, _is_mobile code> devrait être considéré comme privé. Toutefois, phonumbers.number_type code> peut être utilisé tel quel et semble renvoyer 1 code> pour les numéros mobiles et 0 code> pour les numéros de téléphone fixes. La documentation est clairsemée, bien que ...
Je suis entré dans ma ligne fixe pour tester et il est retourné vrai. Je suis très certain que ma ligne fixe n'est pas un numéro de téléphone portable. PAR DOCUMENTATION: # Dans certaines régions (par exemple, les États-Unis), il est impossible de distinguer entre # la ligne fixe et les numéros mobiles en regardant le numéro de téléphone lui-même. Fixe_line_or_mobile = 2 .... Cette bibliothèque n'est donc pas fiable pour déterminer les numéros mobiles aux États-Unis, peut-être ailleurs
str = input()
import re
if len(str)==8:
pattern=r"[981][^.......$]"
match = re.match(pattern,str)
if match:
print("Valid")
else:
print("Invalid")
else:
print("Invalid")
Le modèle [981] [^ ....... $] code> et la longueur d'entrée attendue ne correspond pas à l'exigence de la question. En outre, vous attribuez une valeur à str code> qui écrasera le type interne str code>.
import phonenumbers
from phonenumbers import carrier, timezone, geocoder
from phonenumbers.phonenumberutil import number_type
number = "+911234567890"
print(carrier._is_mobile(number_type(phonenumbers.parse(number))))
print(phonenumbers.parse("+911234567890"))
my_number = phonenumbers.parse("+911234567890")
print(carrier.name_for_number(my_number, "en"))
print(timezone.time_zones_for_number(my_number))
print(geocoder.description_for_number(my_number, "en"))
print(phonenumbers.is_valid_number(my_number))
print(phonenumbers.is_possible_number(my_number))
The reason is that the is_possible_number() method makes a quick guess on the phone number's validity by checking the length of the parsed number, while the is_valid_number() method runs a full validation by checking the length, phone number prefix, and region.
Regardez cet exemple: anthoniraj.com/python-code- Pour la validation de numéro de téléphone portable
Pourriez-vous fournir quelques exemples, qui sont valides, s'il vous plaît?
@ Alexey sont les réponses non valides? Ils semblent travailler. Pourriez-vous expliquer, cela aiderait vraiment si j'ai mal compris. Merci
@ User7 Les réponses traitent votre question différemment. Actuellement, la réponse de Mikem est plus gracieuse et plus exacte à votre description.
Je suis surpris de voir combien de personnes essaient de tout faire dans une regex. Il est plus facile si vous commencez par rejeter tout sauf des chiffres et des séparateurs approuvés et un indicateur de tête +, puis supprimez les séparateurs, puis utilisez une regex. Mais le paquet phonumbers est presque certainement une meilleure idée encore. C'est un grand monde là-bas.