CCF计算机职业资格考试
201803-3 URL映射 Python实现
思路都在注释里,GitHub上有更多的CCF题目python实现。
代码如下:
# 主要考察re库的使用
# re.match(pattern: str, string: str) -> re.Match obeject :
# 1) .span() :返回匹配字符串的位置: tuple e.g.(0, 9)
# 2) .group() :匹配字符串: str
import re
def Reg(string): # 将参数替换成等价的正则表达
string = string.replace('<int>', r'[0-9]+') # [0-9]: 所有阿拉伯数字 +: 重复
string = string.replace('<str>', r'[a-zA-z0-9\-\.]+') # [a-zA-Z]: 所有英文字母(大写 + 小写) \-\.: 减号与点
string = string.replace('<path>', r'[a-zA-z0-9/\-\.]+') # /: 斜杠
return string
# 输入数据
n, m = map(int, input().split())
rule, name, reg = [None] * n, [None] * n, [None] * n
for i in range(n):
rule[i], name[i] = input().split()
reg[i] = Reg(rule[i])
url = [None] * m
for i in range(m):
url[i] = input()
answer = [''] * m
# 开始处理
for i in range(m):
if not re.match(r'[a-zA-z0-9\_\-\./]+', url[i]) and re.match(r'[a-zA-z0-9\_\-\.\/]+', url[i]).group() != url[i]: # 有非法字符
answer[i] = '404'
else: # 无非法字符
flag = False
for j in range(n): # 遍历所有规则
if re.match(reg[j], url[i]) and re.match(reg[j], url[i]).group() == url[i]: # 有匹配的规则 NoneType没有group()方法
flag = True
answer[i] += name[j]
rule_parts = rule[j].split('/')[1 :] # 因为以'/'开头 去除第一个空串
url_parts = url[i].split('/')[1 :]
for k, part in enumerate(rule_parts):
if part == '<int>':
answer[i] += ' ' + str(int(url_parts[k])) # int()去除前导0
elif part == '<str>':
answer[i] += ' ' + url_parts[k]
elif part == '<path>':
answer[i] += ' ' + '/'.join(url_parts[k :])
break # <path>肯定在最后
break
if not flag : # 没有匹配的规则
answer[i] = '404'
for i in range(m):
print(answer[i])