提取 phone 号码并转换为 whatsapp 格式

Extract phone number and convert to whatsapp format

我是 python 的新手,我需要在我的 Zapier 自动化中使用它。 在我的自动化中,我想将 phone 数字从各种格式转换为特定格式(whatsapp url 目的)。 如何使用 python 提取以下输入并将其转换为特定输出?

输入:
+62 812-3456-7890
62081234567890
6281234567890
+6281234567890
081234567890
(62)81234567890
(62)081234567890
(+62)81234567890
(+62)081234567890

输出:
6281234567890

附加信息: “62”是印度尼西亚的国家代码 通常为 8-12 位数字,包括在“8nn”

前面加上“0”

提前致谢

这不是最佳解决方案,但我想保持它非常简单,因为您是 python 的初学者。

def decode(number: str):
    chars = ['+', '(', ')', '-', ' ']
    for c in chars:
        number = number.replace(c, '')

    return number
        
print(decode('+62 812-3456-7890'))
print(decode('(62)81234567890'))

chars 是要从数字中删除的 list 个字符。

编辑 我试图测试你在问题中给出的每个数字,我发现上面的代码不能按你想要的那样工作。这是我的新解决方案,它通过了所有测试:

def decode(number: str):
    chars = ['+', '(', ')', '-', ' ']
    for c in chars:
        number = number.replace(c, '')

    if number.startswith('0'):
        number = number[1:]
    if not number.startswith('62'):
        number = f'62{number}'
    if number[2] == '0':
        number = number.replace('0', '', 1)

    return number

tests = """+62 812-3456-7890
62081234567890
6281234567890
+6281234567890
081234567890
(62)81234567890
(62)081234567890
(+62)81234567890
(+62)081234567890"""
        
for num in tests.split('\n'):
    print(decode(num))

我添加了一些 if 语句来处理所有测试异常,还为您提供的每个测试用例添加了测试。

测试输出:

6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890

另一种思考问题的方法是,不要确定要抛出的字符,只需保留数字即可:

def decode(number):
    out = []
    for c in number:
        if c.isnumeric():
            out.append(c)
    return ''.join(out)

也可以写成列表推导式:

def decode(number):
    return ''.join( c for c in number if c.isnumeric() )

要删除非整数字符,这里有一个正则表达式方法。 [^0-9]指定所有不是0-9的字符,然后用空字符串替换。

import re
def decode(input):
    output = re.sub('[^0-9]', '', input)
    return output

列表理解可能更直观一些。我们实际上构建了一个仅包含数字字符的数组,然后 return 连接数组。

def decode(input):
    output = [n for n in input if n.isnumeric()]
    return ''.join(output)

所以如果我们想通过测试用例,需要做更多的工作(即如果有 none 添加国家代码并删除国家代码和实际 [= 之间的零27=]个数).

def get_phonenum(input):
    # remove all non-numeric characters from the phone number
    only_digits = decode(input)

    # assuming that the inputs are constrained to country code 62
    only_digits = only_digits if only_digits[:2] == '62' else '62' + only_digits

    # remove zero between country code and actual phone number
    phone_num = only_digits[:2] + only_digits[3:] if only_digits[2] == '0' else only_digits

    return phone_num

运行

test = ['+62 812-3456-7890',
        '62081234567890',
        '6281234567890',
        '+6281234567890',
        '081234567890',
        '(62)81234567890',
        '(62)081234567890',
        '(+62)81234567890',
        '(+62)081234567890']

for t in test:
    print(get_phonenum(t))

产出

6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890
6281234567890