-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()代わりにメソッドを使用して、すべての一致を反復処理できます。

  • .*単語の前後に使用すると、その単語が のように別の単語の途中にある場合に一致しDogFoodingます。これはおそらくあなたが望むものではありません。\b代わりに、マッチで魔法のアトムを使用できます。これについては、reドキュメントで次のように説明されています。

    \b 空の文字列に一致しますが、単語の先頭または末尾にのみ一致します。単語は一連の英数字またはアンダースコア文字として定義されるため、単語の終わりは空白または非英数字、非アンダースコア文字で示されます…</p>

    バックスラッシュを手動で二重にしてエスケープするのではなく、特別なr''生の文字列構文を使用することをお勧めします。

  • (.*)一致の前後に何が起こるかを見つけるために を使用すると、正規表現の使用が難しくなります。これは、単語が複数回出現しても重複しない一致が存在しないためです。代わりに、メソッドmatch.start()match.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 に答える