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