CCF计算机职业资格考试 201803-3URL映射 Python实现

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])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值