Если вы хотите проверить, соответствует ли что-либо регулярному выражению, если это так, выведите первую группу, то вы сделаете ..
import re
match = re.match("(\d+)g", "123g")
if match is not None:
print match.group(1)
Это совершенно педантично, но промежуточная переменная match
немного раздражает.
Такие языки, как Perl, делают это путем создания новых $1
.. $9
переменных для групп соответствия, например ..
if($blah ~= /(\d+)g/){
print $1
}
Из этого комментария reddit ,
with re_context.match('^blah', s) as match:
if match:
...
else:
...
.., которая мне показалась интересной, поэтому я написал простую реализацию:
#!/usr/bin/env python2.6
import re
class SRE_Match_Wrapper:
def __init__(self, match):
self.match = match
def __exit__(self, type, value, tb):
pass
def __enter__(self):
return self.match
def __getattr__(self, name):
if name == "__exit__":
return self.__exit__
elif name == "__enter__":
return self.__name__
else:
return getattr(self.match, name)
def rematch(pattern, inp):
matcher = re.compile(pattern)
x = SRE_Match_Wrapper(matcher.match(inp))
return x
return match
if __name__ == '__main__':
# Example:
with rematch("(\d+)g", "123g") as m:
if m:
print(m.group(1))
with rematch("(\d+)g", "123") as m:
if m:
print(m.group(1))
(Эта функция теоретически может быть исправлена в объекте _sre.SRE_Match
)
Было бы неплохо, если бы вы могли пропустить выполнение блока кода оператора with
, если совпадений не было, что упростило бы это до ..
with rematch("(\d+)g", "123") as m:
print(m.group(1)) # only executed if the match occurred
.. но это кажется невозможным, исходя из того, что я могу вывести из PEP 343
Есть идеи? Как я уже сказал, это действительно тривиальное раздражение, почти на грани того, чтобы быть code-golf ..