在数组中分割字符串

3
我正在使用Python编写一个程序,它可以读取文本文件并执行其中的任何Python命令。这些命令可能是无序的,但每个命令都有一个字母ID,例如{% (c) print x %}
我已经能够将文档中的所有命令按正确的顺序排序到一个数组中。我的问题是,如何去掉(c),以便我可以在字符串上运行exec(statement)
以下是完整的示例数组:
[' (a) import random ', ' (b) x = random.randint(1,6) ', ' (c) print x ', ' (d) print 2*x ']

另外,我对Python非常陌生,这是我的第一个Python作业。


数组示例,以便我们找到一种删除的方法。 - Ankur Jyoti Phukan
str.replace('(c)', '') - TessellatingHeckler
1
可能是重复的问题:如何使用Python从字符串中删除字符? - TessellatingHeckler
是的,只需要从数组中返回一到两行。 - Ankur Jyoti Phukan
exec(statement[5:]) 试一下,这会有所帮助.. 我尝试获取子字符串,以便它不包括 (a)。 - Ankur Jyoti Phukan
显示剩余2条评论
5个回答

1

选取右括号及exec之前的所有内容:

for cmd in arr:
    exec(cmd.split(") ")[-1])

我明白这是如何工作的,我很喜欢它。但是我的for循环出现了无效语法错误。当然我使用了自己的变量,但一旦我解决了这个错误,我可能会使用这个方法。 - sbowde4

1
你可以使用substring来删除索引部分:
for cmd in arr:
   exec(cmd[5:])

1
这是最快的方法,也是最好的方法,因为我不想完全删除索引。因为它将在以后被使用。 - sbowde4
很好,它简洁、快速且易于解释 :-) 然而,使用正则表达式的方法能够适应空格的变化,并且对于更大的输入还可以有一个超过一个字符的命令 ID。 - Raymond Hettinger

1
剥离命令ID前缀是正则表达式的一项良好工作:
>>> import re
>>> commands = [' (a) import random ', ' (b) x = random.randint(1,6) ', ' (c) print x ', ' (d) print 2*x ']
>>> [re.search(r'.*?\)\s*(.*)', command).group(1) for command in commands]
['import random ', 'x = random.randint(1,6) ', 'print x ', 'print 2*x ']

正则表达式组件的含义如下:
  • .*?\) 表示“获取以右括号结尾的任意字符的最短组。”

  • \s* 表示“零个或多个空格字符。”

  • (.*) 表示“将所有剩余的字符收集到 group(1) 中。”

这个解释是否让你明白了呢 :-)


0

由于模式看起来简单而一致,您可以使用正则表达式。

这也允许(a)(abc123)作为有效的ID。

import re

lines = [
    ' (a) import random ',
    ' (b) x = random.randint(1,6) ',
    ' (c) print x ',
    ' (d) print 2*x '
]

for line in lines:
    print(re.sub(r"^[ \t]+(\(\w+\))", "", line))

这将输出:

 import random 
 x = random.randint(1,6) 
 print x 
 print 2*x 

如果你只想匹配单个字母,那么将\w+替换为[a-zA-Z]


0

您可以使用简单的正则表达式来省略花括号中的第一个字母,如下所示:

import re

lst = [' (a) import random ', ' (b) x = random.randint(1,6) ', ' (c) print x ', ' (d) print 2*x ']

for ele in lst:
    print re.sub("^ \([a-z]\)", "", ele)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接