我正在用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非常新,我对此我的第一个任务。
您可以使用子字符串删除索引部分:
for cmd in arr:
exec(cmd[5:])
将所有内容都送给括号并执行:
for cmd in arr:
exec(cmd.split(") ")[-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*
的意思是"零或更多空间字符"(.*)
的意思是"将所有其余字符收集到组(1)。"
这种解释如何使一切清晰: - )
由于模式看起来很简单且一致,因此您可以使用正则。
这也允许(a)
和(abc123)
作为有效IDS。
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]
。
您可以使用简单的正则拨号来省略括号中的第一个alpha字符为:
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)