首页 > 试题广场 >

参数解析

[编程题]参数解析
  • 热度指数:158004 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

在命令行输入如下命令:

xcopy /s c:\\ d:\\e,

各个参数如下:

参数1:命令字xcopy

参数2:字符串/s

参数3:字符串c:\\

参数4: 字符串d:\\e

请编写一个参数解析程序,实现将命令行各个参数解析出来。


解析规则:

1.参数分隔符为空格
2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s "C:\\program files" "d:\"时,参数仍然是4个,第3个参数应该是字符串C:\\program files,而不是C:\\program,注意输出参数时,需要将""去掉,引号不存在嵌套情况。
3.参数不定长

4.输入由用例保证,不会出现不符合要求的输入
数据范围:字符串长度:
进阶:时间复杂度:,空间复杂度:

输入描述:

输入一行字符串,可以有空格



输出描述:

输出参数个数,分解后的参数,每个参数都独占一行

示例1

输入

xcopy /s c:\\ d:\\e

输出

4
xcopy
/s
c:\\
d:\\e
s = input()
if '\"' not in s:
    #字符串不包含引号,直接空格分割输出即可
    s = s.split()
    print(str(len(s))+'\n'+'\n'.join(s))
else:
    #字符串带有引号
    res = []#定义一个列表,存放提取出来的参数
    start,end = 0,len(s)#定义以空格分割的起始位置为0到字符串末尾
    flag1,flag2 = 1000,1000 #记录前后引号出现的位置
    #通过循环遍历每一个字符,找引号
    for i in range(len(s)):
        if s[i] != '\"':
            #不是引号就继续下一轮循环,判断下一个字符是不是引号
            continue
        else:
            #当前字符是引号
            #如果第一个引号的位置还是1000
            #说明当前这个字符就是要找的第一个引号的位置
            if flag1 == 1000:
                flag1 = i
            #如果第一个引号的位置不是1000了,说明第一个引号已经找到了
            #那当前字符就是第二个引号的位置
            else:
                flag2 = i
                #走到这里说明已经找到一对引号了
                #将需要用空格分割的结束位置,置为第一个引号开始的前一个位置
                end = flag1-1
                if flag1 != 0:
                    #由于start,end的初始位置是从字符串的开始到结束
                    #所以只能在第一个引号位置不是字符串的起始位置时
                    #通过start,end去进行空格分割
                    res.extend(s[start:end].split())
                #走到这里有两种情况
                #1:第一个参数就带有引号的时候,略过以空格分割的步骤
                #直接将引号部分放进res
                #2:引号前有不带引号的参数
                #将引号前的内容以空格分割后放进res,再把引号内容放进res
                res.append(s[flag1+1:flag2])
                #更新一空格分割的起始位置
                start = flag2+2
                end = len(s)
                #将引号位置重置为1000,开始下一轮循环找下一对引号
                flag1 = flag2 = 1000
    #这一步是处理:最后一个带引号的内容后面还有内容
    #需要将这部分内容以空格分割处理放进res
    res.extend(s[start:end].split())
    print(str(len(res))+'\n'+'\n'.join(res))

发表于 2022-05-01 21:28:51 回复(0)
应该是目前最简短的代码了
思路如下:
如果没有引号字符中间的空格,同时去掉引号的话,我们可以直接split来得到结果
因此我们的思路可以是遍历一边字符串,而后把引号中的空格换为其他的连接符号,例如'_'
这样通过split直接可以得到最终的结果,在打印的时候将'_'替换为空格即可
由于python没有办法在循环时更改循环控制变量,不能直接跳到右引号处,因此,时间浪费还是有一些的
代码如下:
while True:
    try:
        c = list(input())
        for i in range(len(c)):
            if c[i] == '\"':
                c[i] = ''                    #替换掉左边引号
                for j in range(i+1,len(c)):
                    if c[j] == ' ':
                        c[j] = '_'           #替换空格为'_'
                    if c[j] == '\"':
                        c[j] = ''。          #替换掉右边引号
                        break
        commond = (''.join(c)).split()
        print(len(commond))
        for part in commond:
            print(part.replace('_', ' '))    #将'_'替换回来
    except EOFError:
        break


发表于 2021-07-09 16:16:48 回复(0)
方法1:正则化
#xcopy /s "C:\program files" "d:\" 下面大佬的正则不适合这条数据
#大佬没考虑多个引号相连的情况,按他程序完善下也解释下,毕竟正则语法很烦。
#而他的正则比较直观适合解释是按照四个参数分的适合拿来观摩学习!
import re
while True:
    try:
        cmds = input()
        cmds = re.findall(r'".+?"|/\w+|\w:\\|\w+', cmds) #'\".+\"|\/\w+|\w\:\\|\w+' 大佬的正则,想学习熟悉正则的可以对比下
        #首先 . ^ $ * + ? {} [] \ | () 元字符, 大佬的\"可以直接写成"因为不属于元字符无需转义不影响
        #".+?" 查找全部引号后经过任意字符(.)一个或一个以上(+)但尽可能少重复也就是贪婪(?)并以引号结尾的,下面大佬忘记?则不适合我第一行的输入会把第一个引号开始直到引号整体结束的归为一个整体("C:\program files" "d:\"归为一项)
        #|/\w+  或匹配左右任意一个表达式(|) 以/开头(参数1,由于/不是元字符其实不用转义可精简大佬的\/为/),后为字母或数字或下划线或汉字(\w)一个或一个以上(+)
        #|\w:\\ 或匹配左右任意一个表达式(|) 以字母或数字或下划线或汉字开头(\w),跟着:同样冒号不是元字符我们去掉大佬的转义符跟着\由于这个是元字符需要转义为\\(参数3和4)
        #|\w+ 或匹配左右任意一个表达式(|)以字母或数字或下划线或汉字开头(\w)一个或一个以上(+)
        #以上正则化的意思,哪里不对还请指出见谅
        print(len(cmds))
        for cmd in cmds:
            cmd = cmd.replace('"', "") #去除引号
            print(cmd)
    except:
        break 
方法2:string 特性
while True:#既然表示不会出现不符合的,而且参数名没有\n,直接用string特性搞定
    try:
        a = list(input())
        counter = 0#记录是不是首次出现引号
        co2 = 1#记录总参数个数,初始为1
        for i in range (len(a)):#遍历替换
            if counter == 0 and a[i] == ' ':
                a[i] = '\n'#不在引号内时替换为\n
                co2=co2+1
            elif a[i] == '"' and counter ==0:
                a[i] =''#出现引号记录为引号开始并去除引号
                counter = 1
            elif a[i] == '"' and counter ==1:
                a[i] =''#再次出现引号记录为引号结束并去除引号
                counter = 0
        a=''.join(a)
        print(co2)
        print(a)
    except:
        break



编辑于 2021-07-02 17:51:17 回复(1)
'''
解题思路:
1、先以split()空格切割成list
2、判断list的元素是否成对存在‘"’,是单个存在还是成对存在;
3、若单个存在则代表""之间有空格被切割开来了,即到下个存在'”'的元素之间为一个字符串";
4、筛选出来后组合在一起即可,记得把空格补上,最后一个带'"'组合时不带空格;
5、最后打印有双引号的字符,使用[1:-1]把引号去掉
'''
while True:
    try:
        string = input().split()
        flag = False
        str01 = ""
        print_str = []
        for i in string:
            if '\"' not in i:
                if not flag:
                    print_str.append(i)
                else:
                    str01 += i + " "
            elif i.count('\"')==2:
                print_str.append(i)
            elif i.count('\"')==1:
                flag = not flag
                if i[-1] is '\"':
                    str01 += i
                    print_str.append(str01)
                else:
                     str01 += i + " "
            else:
                pass
        print(len(print_str))
        for i in print_str:
            if '\"' in i:
                print(i[1:-1])
            else:
                print(i)
    except:
        break

发表于 2021-06-14 15:14:27 回复(0)
import sys,re

for s in sys.stdin:
    s = s.strip()
    end = []
    lst1 = re.findall('"(.*?)"',s)
    lst2 = s.split('"')
    for i in lst2:
        if i == '':
            continue
        elif i not in lst1:
            i = i.strip().split(' ')
            for j in i:
                end.append(j.strip())
        else:
            end.append(i)
    print(len(end))
    for x in end:
        print(x)
发表于 2021-05-28 10:52:55 回复(0)
import re


s = input().split()

res = []
i = 0
# 此处不能用for循环
while i in range(len(s)):
    if s[i].count('"') == 2:
        res.append(s[i].replace('"', ''))
        i += 1
    elif s[i].count('"') == 1:
        tmp = s[i].replace('"', '')
        for j in range(i+1, len(s)):
            if s[j].count('"') == 1:
                tmp = tmp + ' ' + s[j].replace('"', '')
                break
            else:
                tmp = tmp + ' ' + s[j]
        res.append(tmp)
        i = j+1
    else:
        res.append(s[i])
        i += 1

print(len(res))
for c in res:
    print(c)

发表于 2021-05-01 15:57:46 回复(0)
参考大佬的有2组没通过,修改了3行代码,仅供参考
while True:
    try:
        m=input().split()
        count=0
        result=[]
        i=0
#         判断双引号“”是否成对出现,只有左引号,则往后找后引号,元素累加
        while i in range(0, len(m)):
            if m[i].count('"')==2:
                result.append(m[i].replace('"', ''))
                count+=1
                i+=1
            elif m[i].count('"')==1:
                j=0
                temp=m[i].replace('"', '')+' '
                for j in range(i+1, len(m)):
                    if m[j].count('"')==1:
#                         count+=1
                        temp=temp+m[j].replace('"', '')
                        break
                    else:
                        temp=temp+m[j].replace('"', '')+' '
                        
                result.append(temp.replace('"', ''))
                count+=1
                i=j+1
            else:
                result.append(m[i].replace('"', ''))
                count+=1
                i+=1
        print(count)
        for i in result:
            print(i)
    except:
        break
编辑于 2021-04-12 00:26:02 回复(0)
while True:
    try:
        cmd = input()
        cmds = []
        start = 0
        i = 0
        while i < len(cmd):
            if cmd[i] == '"':
                cmds.append(cmd[i+1:cmd.index('"', i+1)])
                start = cmd.index('"', i+1) + 1
                i = cmd.index('"', i+1) + 1
            elif cmd[i].isspace() == True:
                if cmd[i-1] != '"':
                    cmds.append(cmd[start:i])
                start = i + 1
                i += 1
                if ' ' not in cmd[i:]:
                    cmds.append(cmd[i:])
            else:
                i += 1
        print(len(cmds))
        for x in cmds:
            print(x)
    except EOFError:
        break

发表于 2021-03-28 22:00:51 回复(0)
笨办法,先用引号分隔,再根据原字符串中引号在不在开头,判断哪些项是原来引号里面的。如果引号在开头,那么奇数项是原来引号里面的,否则偶数项
while True:
    try:
        str1=input()
        list1=str1.split('"')
        list2=[]
        if str1.startswith('"'):
            for i in range(len(list1)):
                if i%2==0:
                    list2.append(list1[i])
                else:
                    if list1[i]!='':
                        list1[i]=list1[i].split()
                        for j in list1[i]:
                            list2.append(j)
        else:
            for i in range(len(list1)):
                if i%2!=0:
                    list2.append(list1[i])
                else:
                    if list1[i]!='':
                        list1[i]=list1[i].split()
                        for j in list1[i]:
                            list2.append(j)
        print(len(list2))
        for each in list2:
            print(each)
    except:
        break

发表于 2021-03-16 10:03:31 回复(0)
比较坑爹的是,题目里文字描述的例子是中文 “ ”,想复制过来测试一下被坑了。。。
发表于 2021-02-04 18:12:12 回复(0)
通过设置左引号出现的标志位来解决
def func():
    param_list = input().strip().split()
    # 设置标志位hasleft代表已经出现了左引号,初始化为False
    hasleft = False
    res = []  # 结果列表
    temp = ''  # 用于临时存储引号内的多个段,处理完一个引号段,要及时置空。
    for param in param_list:
        if param.startswith('\"'):
            if param.endswith('\"'):
                res.append(param[1:-1])
            else:
                hasleft = True
                temp += param[1:] + ' '
        else:
            if param.endswith('\"'):
                hasleft = False
                temp += param[:-1]
                res.append(temp)
                temp = ''  # 一个完整的引号内容处理完成,要将临时变量置空,下一次重新使用
            else:
                if hasleft == False:
                    res.append(param)
                else:
                    temp += (param + ' ')
    # 打印结果
    print(len(res))
    for v in res:
        print(v)


if __name__ == '__main__':
    func()

发表于 2020-12-23 15:45:03 回复(0)
import re
while True:
    try:
        cmds = input()
        cmds = re.findall(r'\".+\"|\/\w+|\w\:\\|\w+', cmds)
        print(len(cmds))
        for cmd in cmds:
            cmd = cmd.replace("\"", "")
            print(cmd)
    except:
        break 
发表于 2020-12-21 00:52:27 回复(0)
#!-*- coding:utf-8 -*-
data = raw_input()
arg_list = []
#用来重复记录'"'出现的次数,每出现两次置0
j = 0
#记录最新的'"'出现的index
h = 0
#记录一组'"'中第一个"出现的index
start = 0
for i in range(len(data)):
    if data[i] == '"':
        if j == 0:
            j += 1
            start = i
            #获取不是包含在"中的arg
            arg_list.extend(data[h:i].split())
        elif j == 1:
            j = 0
            h = i + 1
            #找到第二个",当作一个arg
            arg_list.append(data[start+1:i])

#获取最后一个"之后的args
if h != 0 and h < len(data):
    arg_list.extend(data[h+1:].split())

#输入的字符串中没有"
if not arg_list:
    arg_list = data.split()

print len(arg_list)
for i in arg_list:
    print i
发表于 2020-12-16 11:13:08 回复(0)
import re


params = list(re.finditer(r'([^ "]+)|(".+?")', input()))
print(len(params))
for p in params:
    print(p.group().strip('"'))

发表于 2020-12-13 00:08:39 回复(0)
while True:
    try:
        order = []
        s = input()
        s += ' '
        temp = ''
        judge = False
        for each in s:
            if each == '"':
                judge = not judge
            elif each == ' ' and judge == False:
                order.append(temp)
                temp = ''
            else:
                temp += each
        print(len(order))
        for each in order:
            print(each)
    except:
        break
发表于 2020-12-10 12:49:45 回复(0)
思路:先直接用空格将输入字符串分开,对每一个参数来说:
(1)如果参数不带引号,分隔正确;
(2)如果参数中带引号,但参数中不存在空格,分隔正确;
(3)如果参数中带引号,且参数中有空格,那这个参数会被分成几段,分隔段数为空格数加1,分隔错误。
下一步就是将被分开成几段的带引号参数合并成一个元素,依次判断分隔后的每一个元素
# 2020年11月14日16:43:06
while True:
    try:
        string = input().split()
        new_string = []
        i = 0
        while i < len(string):
#           以引号开头
            if string[i][0] == '“':
#               不以引号结束
                if string[i][-1] != '”':
#                   与列表后一个元素合并
                    string[i+1] = string[i] + " " + string[i+1]
                    i += 1 
#               以引号开头,以引号结束,去掉前后的引号
                else:
                    new_string.append(string[i][1:-2])
                    i += 1
#           不以引号开头,不以引号结束,属于分隔正确的参数
            elif string[i][-1] != '”':
                new_string.append(string[i])
                i += 1
        print(len(new_string))
        for i in range(len(new_string)):
            print(new_string[i])
    except:
        break
        

        



编辑于 2020-11-14 17:06:45 回复(0)
Python版逐字符处理:
while True:
    try:
        s = input()
        quote = False
        tmp = ''
        segment = []
        for i in s:
            if quote:
                if i != '”':
                    tmp += i
                else:
                    quote = False
            elif i == '“':
                quote = True
            elif i == ' ':
                segment.append(tmp)
                tmp = ''
            else:
                tmp += i
        segment.append(tmp)
        print(len(segment))
        for s in segment:
            print(s)
    except:
        break


发表于 2020-10-23 22:25:21 回复(0)

问题信息

难度:
50条回答 36249浏览

热门推荐

通过挑战的用户

查看代码