在Python中匹配组
Python中有没有一种方法可以在不显式创建匹配对象的情况下访问匹配组(或美化以下示例的另一种方法)?
这是一个示例,以阐明我对此问题的动机:
遵循Perl代码
if ($statement =~ /I love (\w+)/) {
print "He loves $1\n";
}
elsif ($statement =~ /Ich liebe (\w+)/) {
print "Er liebt $1\n";
}
elsif ($statement =~ /Je t\'aime (\w+)/) {
print "Il aime $1\n";
}
翻译成Python
m = re.search("I love (\w+)", statement)
if m:
print "He loves",m.group(1)
else:
m = re.search("Ich liebe (\w+)", statement)
if m:
print "Er liebt",m.group(1)
else:
m = re.search("Je t'aime (\w+)", statement)
if m:
print "Il aime",m.group(1)
看起来很尴尬(如果为其他级联,则匹配对象创建)。
-
您可以创建一个小类,该类返回调用match的布尔结果, 并 保留匹配的组以供后续检索:
import re class REMatcher(object): def __init__(self, matchstring): self.matchstring = matchstring def match(self,regexp): self.rematch = re.match(regexp, self.matchstring) return bool(self.rematch) def group(self,i): return self.rematch.group(i) for statement in ("I love Mary", "Ich liebe Margot", "Je t'aime Marie", "Te amo Maria"): m = REMatcher(statement) if m.match(r"I love (\w+)"): print "He loves",m.group(1) elif m.match(r"Ich liebe (\w+)"): print "Er liebt",m.group(1) elif m.match(r"Je t'aime (\w+)"): print "Il aime",m.group(1) else: print "???"
Python 3 print作为函数的更新,以及Python 3.8赋值表达式-现在不需要REMatcher类:
import re for statement in ("I love Mary", "Ich liebe Margot", "Je t'aime Marie", "Te amo Maria"): if m := re.match(r"I love (\w+)", statement): print("He loves", m.group(1)) elif m := re.match(r"Ich liebe (\w+)", statement): print("Er liebt", m.group(1)) elif m := re.match(r"Je t'aime (\w+)", statement): print("Il aime", m.group(1)) else: print()