Python字符串编辑器

Python字符串编辑器,python,string,Python,String,我参加了一个编程竞赛(我不知道为什么,我几乎不懂任何高级Python),因为我的老师认为这是个好主意。其中一个实践项目是创建一个字符串编辑器,其中包含6个函数,即插入、删除、反转、更新/替换、追加和预结束字符串。输入的语法应类似于: computer I 3 BIT 输出为 comper 因此,第一部分是要编辑的字符串,第二部分是操作(I表示插入,D表示删除,R表示反转,等等)。问题是,其余的事情是不同的。对于I、D和R,有4个部分。第三个是操作的起点。第四个是为I插入的字符串,为D删除的字

我参加了一个编程竞赛(我不知道为什么,我几乎不懂任何高级Python),因为我的老师认为这是个好主意。其中一个实践项目是创建一个字符串编辑器,其中包含6个函数,即插入、删除、反转、更新/替换、追加和预结束字符串。输入的语法应类似于:

computer I 3 BIT
输出为

comper
因此,第一部分是要编辑的字符串,第二部分是操作(I表示插入,D表示删除,R表示反转,等等)。问题是,其余的事情是不同的。对于I、D和R,有4个部分。第三个是操作的起点。第四个是为I插入的字符串,为D删除的字符数,与为R删除的字符数相同。这是我可以处理的。但是,更新/替换有5个部分。字符串、修饰符(U)、开始位置、要替换的字符数以及要替换的子字符串

类似地,Append和Prepend有3个部分。原始字符串、修饰符(A或P)以及要前置或追加的子字符串

到目前为止,我已经找到了以下代码

while True:
    Full_String = input("Please enter a string, modifier, start character, and iteration modifier: ")
    string, modifier, start, itermod = Full_String.split (" ")
    print (string)
    print (modifier)
    print (start)
    print (itermod)
打印命令仅用于确保字符串正确拆分。但是,每当我尝试使用某些操作所需的3或5个参数时,就会出现ValueError。通常,我可以添加Try-Except块来捕获错误,但是如果没有两个级别的用户输入,我想不出如何做到这一点

那么,无论发生什么情况,我如何才能将其归结为一行输入呢?每个的输入应如下所示:

插入:字符串I 2新

删除:字符串D 2 3

反面:字符串R23

更新/替换:字符串u23 new(字符串长度必须与前面的参数相同,即3 new、4 news、5 great)

追加:字符串一个新的

前置:字符串p New


非常感谢任何帮助。

如果我想要干净的代码,我会亲自解决它,如:

full_string = input("Please enter a string, modifier, start character, and iteration modifier:")
command = full_string.strip().split() # doesn't care about amount of whitespace used

if command[1] == 'I':
    # insert specific instructions
    string, _, start, itermod = command
    ...
...
elif command[1] == 'R':
    # replace specific
    string, _, index1, index2, new_string = command
...
为每一条字符串指令做一个案例

您可能还可以使用注释中描述的带星号的语法:

string, command, *args = full_string.split(" ") # args is now a list of arguments
但这在python2中不起作用

更新:正如bruno desthuilliers所指出的,理想情况下,您应该为每种情况使用函数。尽管就我个人而言,我更愿意避免导致额外复杂性的构造(如字典/函数指针)

如果要使用额外的功能,我自己可能会这样做:

def do_insert(string, start, itermod):
    ... program logic ...

def do_update(string, index1, index2, replacement):
    ... program logic ...

...

while True:
    full_string = input("Please enter a string, modifier, start character, and iteration modifier:")

    # doesn't care about amount of whitespace used
    command = full_string.strip().split() 

    # split the command into string, modifier and additional variable args
    string, modifier, extra_args = command[0], command[1], command[2:]

    if modifier == 'I':
        do_insert(string, *extra_args)  
    elif modifier == 'D':
        do_delete(string, *extra_args)
    elif modifier == 'U':
        do_update(string, *extra_args)
    ...
此处的
*extra_args
将插入
extra_args
的元素作为参数。
例如,调用
func(a,b,*[1,2,3])
将被转换为
func(a,b,1,2,3)
输入内容及其解析方式取决于命令,因此每个命令应该有一个解析器。您可以使用dict将命令(“I”、“D”、“R”等)映射到解析器函数来实现这一点:

def parse_insert(args):
   # code to parse arguments for an insert
   return {
      "start": args[0], 
      "itermod": args[1]
   }



def parse_delete(args):
   # code to parse argumenst for a delete
   # cf example above

# etc

PARSERS = {
    "I" : parse_insert, 
    "D" : parse_delete, 
    # etc  
}


def main():
    while True:
         full_string = input("Please enter a string, modifier, start character, and iteration modifier: ")
         parts = full_string.split (" ")
         line = parts[0]
         parser = PARSERS[parts[1]]
         op_args = parser(parts[2:]) 
您可能需要类似的操作,即:

def do_delete(line, start, itermod):
    # code here


def do_insert(line, ....)
   # idem


OPERATIONS = {
    "D" : do_delete,
    "I": do_insert,
    # etc
}



def main():
    while True:
         full_string = input("Please enter a string, modifier, start character, and iteration modifier: ")
         parts = full_string.split (" ")
         line = parts[0]
         opid = parts[1]
         parser = PARSERS[opid]
         op_args = parser(parts[2:]) 
         print(line, opid, op_args)
         op = OPERATORS[opid]
         result = op(line, **op_args)
         print(result)

这仍然需要一些错误处理,但这应该让您开始

让我们修复您的拆分问题,您可以自己编写程序的其余部分
split()
接受第二个参数,告诉它可以拆分多少次。您的编辑命令有三个固定参数,后面跟着变化的内容。因此,您最多可以分为三个部分,检查命令,并根据需要继续:

string, cmd, rest = full_string.split(" ", 2)
if cmd == "I":
    start, toinsert = rest.split(" ", 1)  # `toinsert` string could contain spaces?
elif cmd == "R":
    <etc.>
在这里,
rest
成为一个包含额外参数(如果有)的列表,您可以再次根据命令重新分配这些参数

if cmd == "I":
    toinsert = rest[0]
elif cmd == "R":
    <etc.>
如果cmd==“I”:
toinsert=rest[0]
elif cmd==“R”:

使用split,但将结果保存在单个列表中:
result=Full\u String.split(“”)
。然后,根据
result[0]
的值,您可以参考
result[3]
result[4]
等。您需要查看带星号的表达式。通常,将堆栈跟踪(本例中的ValueError)附加到问题“clean”中会很有帮助代码将抽象出参数解析,以便主循环不必关心它。。。实际上,星型语法在Python2上不起作用。我同意理想情况下应该使用方法。虽然我觉得这个相对简单的目的,一个更简单的设置会更好,特别是如果你只是一个初学者。虽然很优雅,但您的解决方案一开始可能有点复杂。“方法”(嗯,类等)不是唯一可用的抽象。。。只要使用基本的东西(函数、dict、列表、元组),您就可以使主循环完全通用于wrt/操作特性,参见我的答案。
if cmd == "I":
    toinsert = rest[0]
elif cmd == "R":
    <etc.>