Problem C: 命令行选项

发布时间 2023-04-29 10:03:27作者: hangsingplus

Problem Description

请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

Input Description

输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

Output Description

输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。

Sample Input

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

Sample Output

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

ac代码:
 1 #格式字符串
 2 Format = list(input())
 3 length = len(Format)
 4 #合法选项- - 带参数和不带参数
 5 option = []
 6 noption = []
 7 command = []
 8 command.append("ls")
 9 for i in range(length):
10     x = Format[i]
11     if x ==':':
12         option.append(Format[i-1])
13         # 若上一个为带参数的选项,则将其从不带选项的列表中移除
14         if i>1:
15             noption.pop(i-1)#remove是删除元素的值,pop是删除下标对应的值
16     else :
17         noption.append(x)
18 n = int(input())
19 for i in range(1,n+1):
20     # 定义列表接受命令输入
21     ls = []
22     # 存储命令包含的字母选项
23     ch = []
24     # 存储命令包含的带参选项的参数
25     val = []
26     ls = input().split(' ')
27     ls = list(ls)
28     print("Case %d:" %i,end='')
29     length = len(ls)
30     m = 1
31     # 注意m++的位置
32     for j in ls:
33 #        print(j[1])
34         if j[1] in noption and j not in ch:
35     #        print(j)
36             ch.append(j)
37             m += 1
38         elif j[1] in option:
39     #        print(j[1])
40             if j not in ch:
41                 ch.append(j)
42     #        print(m,j,ls[m])
43             val.append(ls[m])
44             m += 1
45         elif j in command:
46             m += 1
47             continue
48         # 遇到数字作为参数
49         elif j[0]>='0' and j[0]<='9':
50             m += 1
51             continue
52         # 遇到其他符号
53         else:
54             break
55     l = len(val)
56 #    print(val)
57     ch.sort()# 默认为升序排列
58     for i in ch:
59         print(" %s" %i,end='')
60         flag = 1
61         if i[1] in option:
62             print(" %s" %val[l-1],end='')
63     print()