Python re match all groups

Match groups in Python

Is there a way in Python to access match groups without explicitly creating a match object (or another way to beautify the example below)? Here is an example to clarify my motivation for the question: Following Perl code

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+)/)
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) 

Caveat: Python re.match() specifically matches against the beginning of the target. Thus re.match(«I love (\w+)», «Oh! How I love thee») would NOT match. You either want to use re.search() or explicitly prefix the regex with appropriate wildcard patterns for re.match(«.* I love (\w+)», . )

@S.Lott: oops, you are right. I didn’t see, though I was looking for before posting; nevertheless there are valuable new answers here

5 Answers 5

You could create a little class that returns the boolean result of calling match, and retains the matched groups for subsequent retrieval:

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 ". " 

Update for Python 3 print as a function, and Python 3.8 assignment expressions — no need for a REMatcher class now:

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

Источник

Читайте также:  Javascript function and event
Оцените статью