python正则表达式匹配规则中{}的运用


import re

n = int(input())
k = r'.*?\((\d{1,2})\)-\d{3}?\D*?'
m = r'<(\w+)>(.*?)(</\1>)'
for i in range(n):
    s = input()
    lst = re.findall(m, s)
    print(lst)
    for p in lst:
        if re.match(k, p[1]):
            lst2 = re.findall(k, p[1])
            lst2.append(p[2])
            lst2.insert(0, '<%s>' % p[0])
            print(lst2)
# 输入:
2
<bb>(01)-123<a>bbb(02)-2784KK</a><xy>stk(1)-123(03)-345b</xy>(04)-123</xy><z>(05)-123</zz>zz<yy>(06)-123</yy>
<bb>(01)-123<a><k>1223</k><a>(01)-12</a>
#输出:
[('a', 'bbb(02)-2784KK', '</a>'), ('xy', 'stk(1)-123(03)-345b', '</xy>'), ('yy', '(06)-123', '</yy>')]
['<a>', '02', '</a>']
['<xy>', '1', '03', '</xy>']
['<yy>', '06', '</yy>']

[('a', '<k>1223</k><a>(01)-12', '</a>')]

模式串k为什么能匹配到(02)-2784?按照规则{m},不是代表左侧字符串只能出现m次么?为什么四位数字也会匹配进去?
求解

花括号后面紧接的那个问号是干嘛用的,如果是可选三位数的话把前面括起来

k = r'.*?\((\d{1,2})\)-(\d{3})?\D*?'

{}则是指定前面的表达式匹配的次数的限制比如 .{1,3}匹配任意字符串至少一次,最多三次