我正在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的新手,我的第一个任务。
答案 0 :(得分:1)
把所有内容都放到括号和exec:
if
答案 1 :(得分:1)
您可以使用子字符串删除索引部分:
for cmd in arr:
exec(cmd[5:])
答案 2 :(得分:1)
剥离命令ID前缀对于regular expression来说是一个很好的工作:
>>> 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*
表示“零个或多个空格字符。”
(.*)
表示“将所有剩余字符收集到组(1)。”
这个解释如何清楚地表明: - )
答案 3 :(得分: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]
。
答案 4 :(得分: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)