描述
输入
有多组数据,每组一行
输出
对每组数据, 抽取出其中的tag及其包含的电话号码中的区号输出。每个tag输出为一行。tag外的电话号码不用理会。
如果找不到tag及其包含的电话号码, 则输出NONE
数据保证不会出现两个tag重叠的情况。
样例输入
2
(01)-123bbb(02)-2784KKstk(1)-123(03)-345b(04)-123(05)-123zz(06)-123
(01)-1231223(01)-12
样例输出
1,03
06
NONE
提示
1) tag中间可以有任何文字,比如 xddd也是一个合法tag
2) 在分组的右边可以通过分组的编号引用该分组所匹配的子串
m = r’(((ab*)c)d)e\3’ #要求 ab*cde后面跟着第三分组的内容
r = re.match(m,“abbbcdeabbbkfg”) # 后面的bbb少一个b则不能匹配,因为第三分组是abbb
print(r.group(3)) # abbb
print(r.group()) # abbbcdeabbb
3) 如果一个正则表达式搞不定,可以先用一个正则表达式抽取某个中间结果,再在中间结果里面手工或者用另外的正则表达式进一步分析
import re
n = int(input())
m = r"<([a-z]+)>(.*?)(</\1>)"
m2 = "\((\d{1,2})\)-\d{3}(?!\d)" # 后向否定断言(?!\d)
for i in range(n):
s = input()
lst = re.findall(m, s) # 先用m提取出每个tag
if lst == []: # 如果没有tag,直接打印NONE
print("NONE")
else:
length = len(lst)
for x in lst: # 对每个tag
xc = re.findall(m2, x[1]) # 用m2提取出tag里的电话号码
if (xc == []):
length -= 1
if length == 0:
print("NONE") # 如果tag里没有电话号码,打印NONE
else:
print("<" + x[0] + ">", end="")
for j in range(len(xc) - 1):
print(xc[j], end=",")
print(xc[-1], end="")
print(x[2])