在Python中匹配组

发布于 2021-01-29 18:40:51

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)

看起来很尴尬(如果为其他级联,则匹配对象创建)。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以创建一个小类,该类返回调用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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看