在我的程序中,我正在阅读另一个python程序,我想找到一些特殊的python关键字。当我找到它们时,我想在找到的关键字前面打印出一些代码。
这是我的代码:
if line.find("def") == True or line.find("if") == True or line.find("elif") == True:
print("<span style=\"color: orange;\">",True,"</span>","<br>", end="")
在印刷声明&#34; True&#34;我希望它是程序读取的值。
我不知道我是在做#34;还是&#34;声明权利,但输出不起作用。 我没有得到任何错误或任何错误。我希望我的输出是上面的HTML代码,然后是找到的关键字和结束的HTML代码。
示例输出:
<span style=\"color: orange;\">if</span>
<span style=\"color: orange;\">def</span>
<span style=\"color: orange;\">elif</span>
答案 0 :(得分:1)
正如您在文档中查找str.find
或仅使用内置帮助所看到的那样,它不返回true或false,它返回找到子字符串的索引,或-1如果没有找到。
所以,line.find("def") == True
总是假的。无论是在第10列还是在第70列,或者根本没有,10,70或-1都不等于True。你想要的是line.find("def") != -1
。
然而。还有一种更好的方法:如果你不关心索引,只需检查"def" in line
:
if "def" in line or "if" in line or "elif" in line:
或者,甚至更好:
if any(keyword in line for keyword in "def", "if", "elif"):
顺便说一句,即使是做返回True
或False
的函数,您几乎也不想检查if x == True
。基本上只有在存在多个可能的真值时,您才需要将True
与其他值区分开来。否则,只需检查if x
。
但是你仍然无法从你写的print
获得你想要的输出:
print("<span style=\"color: orange;\">",True,"</span>","<br>", end="")
您正在打印常量True
;没有办法可以打印其他字符串,如def
,它总是打印True
。
如果您需要知道哪一个匹配,您不能只是将所有条件放在一起,您必须分别测试每个条件,如其他答案所示。
或者......你在这里做的是构建一个非常简单的解析器。您可能需要考虑学习如何使用PEG或pyparsing或其他能使这更容易且更乏味的东西。或者,如果文本文件确实是(合法的)Python源代码,则使用Python stdlib(ast
模块)内置的Python源代码解析器。或者,对于这个简单的事情,只需要正则表达式:
m = re.search(r'def|if|elif', line)
if m:
print("<span style=\"color: orange;\">", m.group(), "</span>","<br>", end="")
答案 1 :(得分:1)
我建议不要在这种情况下使用or
,而是将其分解为if
和elif
语句,以保留找到的关键字。将其存储在变量中(在本例中为value
)并在print语句中使用它。
if line.find("def") != -1:
value = "def"
elif line.find("if") != -1:
value = "if"
elif line.find("elif") != -1:
value = "elif"
print("<span style=\"color: orange;\">", value,"</span>","<br>", end="")
答案 2 :(得分:1)
试试这个:
checklist = ['def', 'if', 'elif']
for x in checklist:
if x in line:
print("<span style=\"color: orange;\">",x,"</span>","<br>")
编辑:
根据您描述的情况尝试此操作
import re
re.compile(r'(((if|elif|else|in)\s*?)+)', re.I).sub(r'<span style=\"color: orange;\">\1</span><br>', line)
另外一个编辑:
然后试试这个:
checklist = ['def', 'if', 'elif']
array = line.split(' ')
output = []
for x in array:
if x in checklist:
output.append("<span style=\"color: orange;\">%s</span><br>" % x)
else:
output.append(x)
print(' '.join(output))