次のコードを使用しようとしています。
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'
この問題を回避する正しい例外/正しい方法は何ですか?
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:
を実行する方が明確なので、個人的には実行するのが好きです。 「明示的は暗黙的よりも優れている」ことを覚えておいてください。 ;)
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()
これを試して:
_clean = ""
regex = re.match(r'^(\S+) (.*?) (\S+)$', full)
if regex:
clean = filter(None, regex.groups())
_
問題は、一致するものが見つからない場合、re.match(r'^(\S+) (.*?) (\S+)$', full)
がNone
を返すことです。したがって、エラー。
注:このように処理する場合、_try..except
_は必要ありません。
例外句にAttributeError
を追加する必要があります。
例外句は、括弧で囲まれたタプルとして複数の例外を指定できます。
try:
clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except (TypeError, AttributeError):
clean = ""
Try、catchを使用してAttributeErrorを処理する方が、はるかにクリーンなソリューションだと思います。実行された行での変換は、非常にコストのかかる操作になる可能性があります。例:.
match = re.match(r'^(\S+) (.*?) (\S+)$', full)
一致がNoneでない場合:clean = filter(None、match.groups())else:clean = ""
上記の場合、正規表現が部分的な結果を提供するように行の構造が変更されました。そのため、一致はnoneではなくなり、AttributeError例外がスローされます。