import re

if __name__ == '__main__':
    if re.match('^\d{3}-\d{8}$', '010-12345678'):
        print('ok')
    else:
        print("failed")

    # 字符串切分
    print('a b   c'.split(' '))  # ['a', 'b', '', '', 'c'] 无法识别连续的空格
    print(re.split(r'\s+', 'a b   c'))  # ['a', 'b', 'c']  无论多少个空格都可以正常分割
    print(re.split(r'[\s\,]+', 'a,b, c  d'))  # ['a', 'b', 'c', 'd']
    print(re.split(r'[\s\,\;]+', 'a,b;; c,  d'))  # ['a', 'b', 'c', 'd']

    # 除了简单地判断是否匹配之外，正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组（Group）
    m = re.match('^(\d{3})-(\d{8})$', '010-12345678')
    print(m.group(0))  # 010-12345678
    print(m.group(1))  # 010
    print(m.group(2))  # 12345678

    # 最后需要特别指出的是，正则匹配默认是贪婪匹配，也就是匹配尽可能多的字符。
    # 举例如下，匹配出数字后面的0
    print(re.match(r'^(\d+)(0*)$', '102300').groups())  # ('102300', '') 由于\d+采用贪婪匹配，直接把后面的0全部匹配了，结果0*只能匹配空字符串了。
    # 必须让\d+采用非贪婪匹配（也就是尽可能少匹配），才能把后面的0匹配出来，加个?就可以让\d+采用非贪婪匹配：
    print(re.match(r'^(\d+?)(0*)$', '102300').groups())  # ('1023', '00')

# 编译
# 当我们在Python中使用正则表达式时，re模块内部会干两件事情：
# 1 编译正则表达式，如果正则表达式的字符串本身不合法，会报错；
# 2 用编译后的正则表达式去匹配字符串。
# 如果一个正则表达式要重复使用几千次，出于效率的考虑，我们可以预编译该正则表达式，接下来重复使用时就不需要编译这个步骤了，直接匹配
    re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
    print(re_telephone.match("010-12345678").group())
