电话号码正则表达式,带有可选文本,可以在在线工具上正常工作,但不能在我的代码中使用

时间:2019-02-11 20:29:37

标签: python regex

我的正则表达式代码可以在在线工具上正常工作,但是在我插入代码时输入相同,因此出现错误

我的正则表达式代码: 用户必须输入电话号码,最少6个数字或最多11个数字。 或者如果他/她没有电话,那么我将通过我的(前端代码)N / A插入。

import re
   while True:
        phone=input("Enter Telephone:")
        phone_r = re.match('^([a-zA-Z/]{3})$|^([0-9]{6,11})$',phone)
        if phone_r == True or phone =='N/A':
            break
        else:
            print("Wrong Value Entered. Please Enter Correct Telephone Number")

为什么此代码无法正常工作,请指导我 它非常基本的正则表达式。 我尝试使用其他方式来达到相同的结果:

^([0-9]{6,11})?([a-zA-Z/]{3})?$

2 个答案:

答案 0 :(得分:2)

如果唯一有效的输入项是“ N / A”或六到十位数字的字符串,那么为什么不只检查“ N / A”的特殊情况,而不是尝试将其包含在正则表达式中?如果您允许“ ([a-zA-Z/]{3})”为有效匹配项,则用户可以输入“ abc”之类的内容,并且仍会被接受。您可以编写正则表达式来严格查找确切的字符串“ N / A”或有效数字,但是更简单的检查也可以:

import re

while True:
    phone = input("Enter the telephone number: ")
    phone_r = re.match('^\d{6,11}$', phone)
    if phone_r or phone.upper() == 'N/A':
        break
    else:
        print('Please enter a valid telephone number or "N/A".')

如果输入的电话号码包含空格,括号,连字符或加号怎么办?您可能想使用re.sub删除这些字符,或者明确告诉用户仅输入数字。

答案 1 :(得分:2)

re.match返回MatchObjectNone,因此phone_r == True这部分不会通过。

尽管您的模式可以使用if phone_r来工作,但[a-zA-Z/]{3}将匹配的一个变体可能是N / A。也可能是AAA,因为字符类与列出的任何字符都匹配。

您可以改用正则表达式只匹配6到11位数字,或者另一种匹配N / A或6到11位数字的方法是:

import re
while True:
    phone = input("Enter Telephone:")
    if (phone.isdigit() and 5 < len(phone) < 12) or phone == 'N/A':
        break
    else:
        print("Wrong Value Entered. Please Enter Correct Telephone Number")