gpt4 book ai didi

python - 替代 `match = re.match(); if match: ...` 成语?

转载 作者:IT老高 更新时间:2023-10-28 21:55:46 30 4
gpt4 key购买 nike

如果您想检查某项是否与正则表达式匹配,如果是,请打印第一组,您就可以了..

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
}

来自 this reddit comment ,

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 中推断出的内容,这似乎是不可能的

有什么想法吗?正如我所说,这真的是微不足道的烦恼,几乎到了代码高尔夫的地步......

最佳答案

我不认为这是微不足道的。如果我经常编写这样的代码,我不想在我的代码周围添加多余的条件。

这有点奇怪,但您可以使用迭代器来做到这一点:

import re

def rematch(pattern, inp):
matcher = re.compile(pattern)
matches = matcher.match(inp)
if matches:
yield matches

if __name__ == '__main__':
for m in rematch("(\d+)g", "123g"):
print(m.group(1))

奇怪的是,它使用了一个迭代器来处理不迭代的东西——它更接近于条件,乍一看它可能会为每次匹配产生多个结果。

上下文管理器不能完全跳过它的托管函数似乎很奇怪。虽然这不是“with”的明确用例之一,但它似乎是一种自然的扩展。

关于python - 替代 `match = re.match(); if match: ...` 成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1152385/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com