このようなことがPythonで可能かどうか疑問に思っています(3.2、それが関連している場合)。
with assign_match('(abc)(def)', 'abcdef') as (a, b):
print(a, b)
動作は次のとおりです。
- 正規表現が一致する場合、正規表現グループはに割り当てられ
a
、b
- そこに不一致がある場合は、例外がスローされます
- 一致する場合は
None
、コンテキストを完全にバイパスします
ここでの私の目標は、基本的に、状況に応じた動作を行うための非常に簡潔な方法です。
次のコンテキストマネージャーを作成してみました。
import re
class assign_match(object):
def __init__(self, regex, string):
self.regex = regex
self.string = string
def __enter__(self):
result = re.match(self.regex, self.string)
if result is None:
raise ValueError
else:
return result.groups()
def __exit__(self, type, value, traceback):
print(self, type, value, traceback) #testing purposes. not doing anything here.
with assign_match('(abc)(def)', 'abcdef') as (a, b):
print(a, b) #prints abc def
with assign_match('(abc)g', 'abcdef') as (a, b): #raises ValueError
print(a, b)
実際には、正規表現が一致する場合とまったく同じように機能しますが、ご覧のとおり、一致するものがValueError
ない場合はをスローします。終了シーケンスに「ジャンプ」する方法はありますか?
ありがとう!!