【问题标题】:How to find more words in a file at once?如何一次在文件中查找更多单词?
【发布时间】:2018-03-08 01:32:30
【问题描述】:

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

在打印语句“True”中,我希望它是程序读取的值。

我不知道我是否正确执行“或”语句,但输出不起作用。 我没有收到任何错误或任何东西。我希望我的输出是上面的 HTML 代码,然后是找到的关键字和结束的 HTML 代码。

示例输出:

<span style=\"color: orange;\">if</span>
<span style=\"color: orange;\">def</span> 
<span style=\"color: orange;\">elif</span>

【问题讨论】:

标签: python file if-statement printing find


【解决方案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】:

    正如您在文档中查找 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 标准库(ast 模块)内置的 Python 源代码解析器。或者,对于这么简单的事情,只是正则表达式:

    m = re.search(r'def|if|elif', line)
    if m:
        print("<span style=\"color: orange;\">", m.group(), "</span>","<br>", end="") 
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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))
      

      【讨论】:

      • 我喜欢这个并且有点工作,但是例如当使用上面的关键字“in”时,如果 x "in" 行。这也是一个橙色的词。我怎样才能打印出该行,直到“in”字,然后是该行的其余部分?例如:print(line[:x]"",x,"",line[x:]"
        ", end="" )
      • 你可以打印它..我不太熟悉你的用例是什么,但这会将标签包裹在该列表中的任何单词周围,但会打印出整行
      • 好的,所以它确实打印了它,但是现在每次行中都有单词“if”,即使单词 if 在关键字“elif”中,这也会用 if 复制该行行而不是 elif 行,然后是原始行。
      • 我的代码现在看起来像这样: for line in infile: for x in checklist: if x in line: 可能是因为 2 个 for 循环导致它重复?
      • 我又添加了一个尝试。请告诉我它是如何工作的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多