概括一个简单的电话号码正则表达式



这是一个简单的例子来说明我要做的。

假设我想编写一个函数,它接受一个未处理的电话号码字符串(示例如下),并返回该字符串的特定格式。

"123-4567" --> "123-4567"
"123.4567" --> "123-4567"
"1234567" --> "123-4567"

我可以使用正则表达式模式"^[0 - 9]{3}[-]{0,1}[0 - 9]{4}"美元;来匹配3种可能性,但如果匹配,我仍然需要检查它匹配的类型。

def process(original):
if re.match("^[0-9]{3}[-.]{0,1}[0-9]{4}$", original):
# Maybe some other stuff I only want to put once
if re.match("^[0-9]{3}-[0-9]{4}$" original):
# Stuff
elif re.match("^[0-9]{3}.[0-9]{4}$", original):
# Stuff
elif re.match("^[0-9]{7}$", original):
# Stuff

这似乎有过多的冗余。

我可以跳过外部的if,但可能有一些东西我必须重复复制/粘贴,如所示。而且,这也不能解决所有的冗余问题。

我知道我可以检查if '-' in originalif '.' in original,或者只是如果长度是8而不是7。

我的问题是有一个更通用的解决方案,不引入冗余或其他问题。

首先你可以用"d"将{0,1}替换为"?"。
如果你把"[-.]"在一个组中,你可以用这个代码看到你的号码与什么匹配:

代码:

import re
pattern = "^d{3}([-.])?d{4}$"
numbers = ["123-4567", "123.4567", "1234567"]
for number in numbers:
m = re.match(pattern, number)
if m.group(1) == '-':
pass
elif m.group(1) == '.':
pass
else:
pass

可以去掉非数字字符,然后插入破折号:

semiformatted = "".join(c for c in unformatted if c.isdigit())
if 7 == len(semiformatted):
formatted = semiformatted[:3] + "-" + semiformatted[3:]
else:
# Or however you'd like to handle bad numbers
raise Exception(f"This is bad input: {unformatted}")

它基本上是非物质的,但是如果你想使用正则表达式去掉字符,你可以这样做:

semiformatted = re.sub("[^0-9]", "", unformatted)

最新更新