【问题标题】:How to include "Elif" in "if match" command - Python如何在“if match”命令中包含“Elif” - Python
【发布时间】:2014-11-23 16:47:42
【问题描述】:

我希望我的脚本在特定文件 (text.txt) 中搜索“JOL:”; “哭:”; “LAY:”,如果它没有找到“JOL:”,我希望它搜索“CRY:”,如果它没有找到“CRY:”来寻找“LAY:”。 问题是我不知道是否可以在“匹配”命令中包含“Elif”,如果是这样的话......如何?

import re, os

mykey = open("text.txt", "r")
take = open("take.txt", "w")
match = re.search ('"JOL":"(.+?).tr', text)
match2 = re.search('"CRY":"(.+?).tr', text)
match3 = re.search ('"LAY":"(.+?).tr', text)

for text in mykey:
    if match:
        print >> take, match.group(1)
    elif match:
        print >> take, match2.group(1)
    elif match:
        print >> take, match3.group(1)

谢谢

【问题讨论】:

  • 为什么你的print声明中有>>
  • 您有 3 个不同的正则表达式,它们对应于 3 个不同的 match 变量。如果您要测试类似 如果我没有找到与第一个模式匹配的内容,我会尝试使用 other 匹配,如果我仍然找不到任何内容,我会尝试与第三个匹配?
  • @pad:这就是在 Python 2.x 中打印到文件的方式:stackoverflow.com/a/9316160/47453
  • @BorrajaX 是的,我正在尝试这样做。但是如何?
  • @BillLynch 整洁,谢谢!

标签: python if-statement match


【解决方案1】:

在我看来,问题在于您总是在测试文本是否与 match 匹配:

所以,让我们稍微简化一下。下面的代码会发生什么?:

match = None
if match:
    # The interpreter will never get here because `match` is None, which
    # evaluates to False when in an `if`
    print >> take, match.group(1)
elif match:
    # This `elif` is still testing against `match`, which is still None,
    # therefore, evaluated to false. 
    print >> take, match2.group(1)
elif match:
    # Same drill here...
    print >> take, match3.group(1)

我猜你想这样做:

if match:
    print >> take, match.group(1)
elif match2:
    print >> take, match2.group(1)
elif match3:
    print >> take, match3.group(1)

编辑:

也许以下代码可以帮助您了解正在发生的事情。下面的代码通过做两件事来改变你的:

  1. 逐行读取输入文件
  2. 将每一行与三个表达式中的每一个进行匹配

进行这些更改后,代码将如下所示:

import re, os

mykey = open("text.txt", "r")
take = open("take.txt", "w")

print "I have opened a file object to read stuff. That is: %s" % mykey
print "I have opened a file object to write stuff. That is: %s" % take

for text in mykey:
    print "I have read the line: %s" % text
    match = re.search('"JOL":"(.+?).tr', text)
    match2 = re.search('"CRY":"(.+?).tr', text)
    match3 = re.search('"LAY":"(.+?).tr', text)
    if match:
        print >> take, match.group(1)
    elif match2:
        print >> take, match2.group(1)
    elif match3:
        print >> take, match3.group(1)

如果text.txt 包含以下内容:

"JOL":"foo1".tr
"CRY":"bar1".tr
"LAY":"baz1".tr
"LAY":"baz2".tr
"CRY":"bar2".tr
"JOL":"foo2".tr

运行此脚本后,take.txt 中的内容将是:

foo1"
bar1"
baz1"
baz2"
bar2"
foo2"

我添加了一些print 语句,可能会帮助您了解正在发生的事情。检查您的终端,看看“额外调试”输出是否有助于您了解代码中发生的情况。

您还应该尝试了解文件对象(通常是input-output)在 Python 中的工作原理。

【讨论】:

  • 我有这个错误 NameError : name "text" is not defined
  • 那是一个不同的问题...在该行之前的任何位置初始化text 变量之前,您在match = re.search ('"JOL:"(.+?).tr', text) 中使用text。也许应该是mykey? (不知道)另外,for text in take 循环中还有另一个问题。您的take 变量指向一个只为写入而打开的文件(请参阅open("take.txt", "w") 行)。当你到达那条线时,你会得到一个IOError: File not open for reading
  • 我只是复制了错误的代码。我现在使用的是“我的问题”,但我仍然遇到同样的错误。
  • 是的,'因为你在做同样的事情 :-) 你的解释器不知道text 是什么match = re.search ('"JOL:"(.+?).tr', text) 什么是@987654342 @ 应该是? text.txt的内容?因为你的代码中没有这些。您拥有的最接近的是mykey,但这不是text.txt 文件的内容。是text.txt file 对象(见docs.python.org/2/library/stdtypes.html#bltin-file-objects
  • 我不明白。那我该如何定义“文本”命令? mykey 应该打开并阅读“text.txt”,为什么它不能定义 text.txt 的“内容”?最重要的是,当 mykey 中只有文本时为什么它起作用:如果匹配:打印 >> 采取,match.group(1) 没有“elif”
猜你喜欢
  • 2012-09-22
  • 2017-08-27
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2017-05-03
相关资源
最近更新 更多