如何一次在文件中查找更多单词?

时间:2018-03-08 01:32:31

标签: python file if-statement printing find

在我的程序中,我正在阅读另一个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>

3 个答案:

答案 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"):

顺便说一句,即使是返回TrueFalse的函数,您几乎也不想检查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,而是将其分解为ifelif语句,以保留找到的关键字。将其存储在变量中(在本例中为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))