英国移动电话号码的正则表达式-Python

英国移动电话号码的正则表达式-Python,python,regex,django,Python,Regex,Django,我需要一个只验证英国手机号码的正则表达式 英国移动电话号码可以介于10-14位之间,或者以07开头,或者省略0以447开头 重要的是,如果用户添加了+44,则应将其拒绝 因此,这些是有效的: 0711111111 447111111 这些都是无效的: +4471111111 021929182711 00701029182 到目前为止,我所拥有的: rule = re.compile(r'^\+?(44)?(0|7)\d{9,13}$') if not rule.search(value):

我需要一个只验证英国手机号码的正则表达式

英国移动电话号码可以介于
10-14
位之间,或者以
07
开头,或者省略
0
447
开头

重要的是,如果用户添加了
+44
,则应将其拒绝

因此,这些是有效的:

0711111111

447111111

这些都是无效的:

+4471111111

021929182711

00701029182


到目前为止,我所拥有的:

rule = re.compile(r'^\+?(44)?(0|7)\d{9,13}$')

if not rule.search(value):
    msg = u"Invalid mobile number."
    raise ValidationError(msg)

根据我的规则,这还没有生效;有人能帮忙吗?

如果我理解正确,下面的正则表达式似乎适合您的要求

不允许使用+符号非常简单,因为您只创建了一个值的白名单,而加号不在其中

^(07[\d]{8,12}| 447[\d]{7,11})$

如本答复评论中所述,此处不需要方括号。我加入它们是为了让我自己对这个正则表达式的阅读更容易一些。但是,以下方法同样有效:


^(07\d{8,12}447\d{7,11})$

此StackOverflow帖子可能会有所帮助:@user2246087看起来这是他/她想要验证的英国数字的子集。从这个意义上讲,这不是一个完全相同的副本。@BlackPlanet我不是说它是一个副本,只是为了参考而提到它。
\d
周围的方括号真的有必要吗?我不想吹毛求疵,但我很好奇我是否遗漏了什么。不,他们没有。因为regex一开始就非常简洁,我发现包含方括号之类的内容有助于提高可读性,从而使我更容易在逻辑中找到bug,而不是在regex的一行中保存4个字符@JamesHolderness,这是个好问题。请注意,您的Regexp不可能是正确的,一次是前缀+8-12,另一次是前缀+7-11。在这两种情况下都应该是8-12。@BRBRDO先生我的印象是总数是10-14。一种情况下的前缀为两位数,另一种情况下的前缀为3位数。因此总数将是2+(8~12)和3+(7~11),两者都等于10-14。我不是英国人,但我来自欧盟,对我来说,我的号码是01 1234567,其中01是区号。所以我的号码是7号,区号是01。如果我使用国际前缀-+3861-我的号码仍然是1234567,它不会神奇地变短,因为我更改了前缀。所以是+38611234567。它不会像您的regexp所暗示的那样缩短一个数字。除非英国有一个完全邪恶的电话系统,否则我认为他们也是如此。