Python和RegEx - 搜索和匹配

时间:2012-03-06 17:16:54

标签: python

某个文件(file.dat)

#####Start####
sometext
sometext
From: email@address.net
some text
some text
####End#####

1

import re
for line in open('file.dat'):
    _mail=re.search(r"\w+@\w+\.\w{2,4}").group()
print(type(_mail))

Out:'NoneType'

2

import re
for line in open('file.dat'):
    if(re.match(r"From:.*",line)):
        _mail=re.search(r"\w+@\w+\.\w{2,4}").group()
print _mail

出:email@address.net

请告诉我。为什么我不能先使用?

4 个答案:

答案 0 :(得分:2)

因为在第一种情况下,您要检查模式的每一行。当你在“From:”行时你成功获得了它,但是你的循环继续并且匹配下一行并用你的_mail对象覆盖,因为模式在下一行不匹配。

答案 1 :(得分:1)

您的第一次尝试将搜索每行中的邮件模式。变量_mail将在循环结束时包含re.search的最后结果(以及更精确的文件最后一行的re.search结果)。

所以你的结果会被覆盖。

如果您想使用第一种方式,则必须添加:

if _mail: break

结束循环

答案 2 :(得分:0)

第一个代码段会覆盖_mail,无论您要匹配哪一行。因此,您只能看到应用于输入的最后一行的正则表达式,它不会返回任何结果(因此None)。第二个只匹配From行,这可能是你想要发生的。您也可以在那里使用.startswith('From:')

答案 3 :(得分:0)

sometext行上,你的正则表达式失败了。这意味着您不会获得匹配对象,而None会导致re.search()。如果您然后尝试调用.group()方法,则会失败(因为None当然没有)。所以你应该有一个AttributError(但是你的代码在语法上无论如何都是无效的,所以它根本不应该运行。