您如何将这种正则表达式习语从Perl转换为Python? [英] How do you translate this regular-expression idiom from Perl into Python?
问题描述
大约一年前,我从Perl切换到Python,并且没有回头.我发现只有一个 习惯用法在Perl中比在Python中更容易做:
I switched from Perl to Python about a year ago and haven't looked back. There is only one idiom that I've ever found I can do more easily in Perl than in Python:
if ($var =~ /foo(.+)/) {
# do something with $1
} elsif ($var =~ /bar(.+)/) {
# do something with $1
} elsif ($var =~ /baz(.+)/) {
# do something with $1
}
由于if语句不断嵌套,因此相应的Python代码不太优雅:
The corresponding Python code is not so elegant since the if statements keep getting nested:
m = re.search(r'foo(.+)', var)
if m:
# do something with m.group(1)
else:
m = re.search(r'bar(.+)', var)
if m:
# do something with m.group(1)
else:
m = re.search(r'baz(.+)', var)
if m:
# do something with m.group(2)
有人能用优雅的方法在Python中重现此模式吗?我已经看到使用了匿名函数调度表,但是对于少量的正则表达式来说,这些表对于我来说似乎有点笨拙……
Does anyone have an elegant way to reproduce this pattern in Python? I've seen anonymous function dispatch tables used, but those seem kind of unwieldy to me for a small number of regular expressions...
推荐答案
从Python 3.8
开始,并引入赋值表达式(PEP 572)(:=
运算符),我们现在可以在变量match
中捕获条件值re.search(pattern, text)
,以便检查它们是否不是
Starting Python 3.8
, and the introduction of assignment expressions (PEP 572) (:=
operator), we can now capture the condition value re.search(pattern, text)
in a variable match
in order to both check if it's not None
and then re-use it within the body of the condition:
if match := re.search(r'foo(.+)', text):
# do something with match.group(1)
elif match := re.search(r'bar(.+)', text):
# do something with match.group(1)
elif match := re.search(r'baz(.+)', text)
# do something with match.group(1)
这篇关于您如何将这种正则表达式习语从Perl转换为Python?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!