Python在if语句中使用正则表达式匹配对象,然后像Perl一样访问捕获组

2024-03-25

是否可以在 Python 中执行类似以下 Perl 代码的操作?据我所知,答案是否定的,但我想我应该仔细检查一下。

我想在 Python 中复制 Perl 代码:

#!/usr/bin/perl

my $line = "hello1234world";

if($line=~/hello(.*)world/) {
  print($1);
}
#prints 1234    

以下是我能想到的最接近的风格,但是在运行时我(显然)收到以下错误:

import re
line = "hello1234world"

if matchObj = re.match(r'hello(.*)world',line):
    print(matchObj.group(1))

#error: if matchObj = re.match(r'hello(.*)world',line):
#error:             ^
#error: SyntaxError: invalid syntax

以下是我能想到的最好的工作代码:

import re
line = "hello1234world"

matchObj = re.match(r'hello(.*)world',line)

if matchObj:
    print(matchObj.group(1))
#prints 1234

如果可能的话,我真的很想避免变量声明和 if 语句单独一行。


可以只打印(假设的)捕获并使用异常来处理以下情况:group方法被调用None,当没有匹配时返回。如果比赛失败时确实无事可做,则通过一行使用语句上下文管理器 https://docs.python.org/3/reference/datamodel.html#context-managers (3.4+)

from contextlib import suppress

with suppress(Exception):
    print( re.match(r'hello(.*)world', line).group(1) )

为了避免忽略几乎肯定不应该在这里忽略的异常,例如SystemExit and KeyboardInterrupt, use

with suppress(BaseException):
    ...

现在,正如所要求的那样,它相当紧凑,并且其行为也符合预期。仅仅使用异常来缩短代码可能会被认为是误导,但也许会有进一步的用途。

正如评论中提到的,从 3.8 开始有赋值表达式 https://www.python.org/dev/peps/pep-0572/

if match := re.match(r'hello(.*)world', line):
    print( match.group(1) )

这几乎直接匹配激励语义。然而,这个新功能引起了一些敏感的讨论,而仅仅使用它来缩短代码可能会造成混淆和误导,因为它与预期的 pythonic 方法不同。

我想补充一点,我建议不要担心一些额外的代码行,特别是避免模拟其他语言的样式和程序流程。使用当前语言本身的风格和习语具有巨大的价值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python在if语句中使用正则表达式匹配对象,然后像Perl一样访问捕获组 的相关文章

随机推荐