如何在python脚本中只获得10位数的电话号码

时间:2015-03-27 18:10:03

标签: python string phone-number

我正在查看通过数据库找到有效电话号码的python脚本。与我的问题相关的脚本部分如下所示:

    country_code = ""

(然后再往下):

    for i, entry in enumerate(feed.entry):
        for phone in entry.phone_number:
            # Strip out any non numeric characters
            phone.text = re.sub('\D', '', phone.text)
            phone.text = unicode(phone.text, 'utf8')

            # Remove leading digit if it exists, we will add this again later for all numbers
            # Only if a country code is defined.
            if country_code != "":
                phone.text = re.sub('^\+?%s' % country_code, '', phone.text)

第一个问题是,我看过这个脚本的两个不同的变体,一个使用我上面显示的最后一行,而另一个使用它:

                phone.text = re.compile('^\+?%s' % country_code, '', phone.text)

我想知道区别是什么,以及一个是否比另一个更正确。

但真正的问题是这个数据库只应包含显示为10或11位的北美数字,但我需要的只是十位数字。不幸的是,此脚本会返回找到的任何电话号码所以在最后一行运行之后,我希望看到的是:

如果phone.text字符串的长度少于10个字符或超过11个字符,请将其设置为null。

然后

如果phone.text字符串长度为11个字符,则如果第一个字符为“1”,则删除前导“1”,留下最后10个字符。如果第一个字符不是“1”,则将其设置为空。

然后

如果phone.text字符串是10个字符(换句话说,不是null,因为它应该是10个字符或此时为空)然后检查第一个数字和第四个数字是否在1范围内-9。如果其中任何一个不在该范围内,请将该字符串设置为null。

我完全知道关于python的知识,所以我希望也许有人可以告诉我如何做到这一点,因为它似乎应该相对容易。顺便说一下,文档(例如它)说如果你在国家代码字段中输入“1”,它会将它添加到现在没有它的数字中,这对我来说似乎不对(我可以我不知道会发生什么情况)而且它与我在这种特殊情况下的需求完全相反。谢谢!

编辑:我不想使用REGEX,因为老实说,这不是一个对时间敏感的应用程序(我可以浪费CPU周期)而且我真的无法破译正则表达式 - 它们只是勉强有意义我

我确实发现,如果在行之后

            phone.text = unicode(phone.text, 'utf8')

我添加了这些内容:

            if len(phone.text) == 11 and phone.text[0] == '1':
                #international code
                phone.text = phone.text[1:]
            if len(phone.text) < 10:
                phone.text = ""
            if len(phone.text) > 10:
                phone.text = phone.text[:10]

然后它几乎可以做我需要的东西。正如我所指出的那样,数据库中不包含任何国际号码,因此不存在考虑因素。它确实包含一些带有扩展名的数字,但我只需要10位数的主数字,而不是扩展名,所以在前十位数之后的任何数字都会被切断。在查看建议的基于REGEX的解决方案之后,上面的内容实际上已被破译,有人认为正则表达式并不总是最好的做事方式,我全心全意地同意这种情绪。此外,尽管有许多REGEX以各种方式解析电话号码,但大多数答案只是假设您知道如何在Python中使用REGEX而我不这样做,因为我完全不熟悉该语言。 / p>

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

回答你的第一个问题:

re.compile返回一个正则表达式对象。如果您要在多个位置使用相同的正则表达式模式,那么使用re.compile创建可重用的正则表达式对象会更好。

re.sub(pattern, repl, string, count=0, flags=0)只是简写:

re.compile(pattern, flags).sub(repl, string, count)