-2

我正在尝试使用正则表达式在文本文档中的一行上查找特定单词。我尝试使用下面的代码,但它不能正常工作。

import re
f1 = open('text.txt', 'r')
for line in f1:
    m = re.search('(.*)(?<=Dog)Food(.*)', line)
    m.group(0)
    print "Found it."
f1.close()

错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0
ns\Microsoft\Python Tools for Visual Studio\2.0\visualstudi
0, in exec_file
    exec(code_obj, global_variables)
  File "C:\Users\wsdev2\Documents\Visual Studio 2012\Projec
TML Head Script\HTML_Head_Script.py", line 6, in <module>
    m.group(0)
AttributeError: 'NoneType' object has no attribute 'group'
4

2 回答 2

4

你得到一个AttributeError: 'NoneType' object has no attribute 'group'因为没有找到匹配。

re.search()None如果没有匹配将返回,所以你可以这样做:

import re
with open('text.txt', 'r') as myfile:
    for line in myfile:
        m = re.search('(.*)(?<=Dog)Food(.*)', line)
        if m is not None:
            m.group(0)
            print "Found it."
            break # Break out of the loop

编辑:我已经用你的代码编辑了我的答案。另外,我在with/as这里使用过,因为它之后会自动关闭文件(看起来很酷:p)

于 2013-07-02T13:08:22.397 回答
0

你的程序有几个问题:

  • m如果该行中没有匹配项,则为 none,这就是您的程序崩溃的原因。

  • 如果存在,您的代码只会找到该行中的第一个匹配项。您可以使用该re.finditer()方法来迭代所有匹配项。

  • 当单词出现在另一个单词的中间时,使用.*before 和 after 将匹配该单词,例如DogFooding. 这可能不是你想要的。相反,您可以在比赛中使用魔法\b原子,re文档将其描述为

    \b 匹配空字符串,但只匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字、非下划线字符表示……</p>

    您可能希望使用特殊的r''原始字符串语法,而不是手动加倍反斜杠来转义它。

  • 使用(.*)来查找匹配前后发生的事情使得使用正则表达式变得很困难,因为即使单词出现多次,也不会有不重叠的匹配。相反,使用match.start()andmatch.end()方法来获取匹配的字符位置。Python 的匹配对象在线记录

考虑到这一点,您的代码变为:

#!/usr/bin/env python2.7

import re
f1 = open('text.txt', 'r')
line_number = 1
for line in f1:
    for m in re.finditer(r'\bDogFood\b', line):
        print "Found", m.group(0), "line", line_number, "at", m.start(), "-", m.end()
    line_number += 1
f1.close()

使用此运行时text.txt

This Food is good.
This DogFood is good.
DogFooding is great.
DogFood DogFood DogFood.

程序打印:

Found DogFood line 2 at 5 - 12
Found DogFood line 4 at 0 - 7
Found DogFood line 4 at 8 - 15
Found DogFood line 4 at 16 - 23
于 2013-07-02T13:22:55.013 回答