python - Python中的匹配组

标签 python regex

在 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)

看起来很别扭(if-else-cascade,匹配对象创建)。

最佳答案

您可以创建一个返回调用 match 的 bool 结果的小类,并且保留匹配的组以供后续检索:

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 as a function 和 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()

关于python - Python中的匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554185/

相关文章:

正则表达式负先行被忽略

Javascript正则表达式查找以点开头的单词的完全匹配

javascript - 使用 Javascript 检查输入值的特定格式

python - 使用正则表达式可以吗

python - 切片多维 numpy 数组以获得向量

python - 如何在基于两个变量的单个语句中减少 if 和 elif with

Python 导入问题 : AttributeError: 'NoneType' object has no attribute 'fields'

python - 使用 Python 正则表达式提取带连字符的电话号码

python - 我怎样才能在轴上绘制

python - 游戏代码中存在缩进问题