web-dev-qa-db-ja.com

正規表現の.groups()関数を使用する場合のNoneTypeの正しいTryExceptionは何ですか

次のコードを使用しようとしています。

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except TypeError:
    clean = ""

しかし、私は次のトレースバックを取得します...

Traceback (most recent call last):
  File "test.py", line 116, in <module>
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
AttributeError: 'NoneType' object has no attribute 'groups'

この問題を回避する正しい例外/正しい方法は何ですか?

8
Ryflex

re.matchは、一致するものが見つからない場合、Noneを返します。おそらく、この問題の最もクリーンな解決策は、これを行うことです。

# There is no need for the try/except anymore
match = re.match(r'^(\S+) (.*?) (\S+)$', full)
if match is not None:
    clean = filter(None, match.groups())
else:
    clean = ""

if match:も実行できますが、私はif match is not None:を実行する方が明確なので、個人的には実行するのが好きです。 「明示的は暗黙的よりも優れている」ことを覚えておいてください。 ;)

21
iCodez
Traceback (most recent call last):
  File "test.py", line 116, in <module>
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
AttributeError: 'NoneType' object has no attribute 'groups'

処理するエラーを示します:AttributeError

、それはどちらかです:

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except AttributeError:
    clean = ""

または

my_match = re.match(r'^(\S+) (.*?) (\S+)$', full)
my_match = ''
if my_match is not None:
     clean = my_match.groups()
8
Paco

これを試して:

_clean = ""
regex =  re.match(r'^(\S+) (.*?) (\S+)$', full)
if regex:
    clean = filter(None, regex.groups())
_

問題は、一致するものが見つからない場合、re.match(r'^(\S+) (.*?) (\S+)$', full)Noneを返すことです。したがって、エラー。

注:このように処理する場合、_try..except_は必要ありません。

4
karthikr

例外句にAttributeErrorを追加する必要があります。

例外句は、括弧で囲まれたタプルとして複数の例外を指定できます。

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except (TypeError, AttributeError):
    clean = ""
0
Bruno

Try、catchを使用してAttributeErrorを処理する方が、はるかにクリーンなソリューションだと思います。実行された行での変換は、非常にコストのかかる操作になる可能性があります。例:.

match = re.match(r'^(\S+) (.*?) (\S+)$', full)

一致がNoneでない場合:clean = filter(None、match.groups())else:clean = ""

上記の場合、正規表現が部分的な結果を提供するように行の構造が変更されました。そのため、一致はnoneではなくなり、AttributeError例外がスローされます。

0
Pramit