如果您想检查某些内容是否与正则表达式匹配,如果是,请打印第一组,您可以这样做..
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中推断出的内容,这似乎是不可能的
有任何想法吗?正如我所说,这真的是微不足道的烦恼,几乎到了代码高尔夫的地步。