return string with first match Regex

StackOverflow

I want to get the first match of a regex.

In this case, I got a list:

text = "aa33bbb44"
re.findall("d+",text)

["33", "44"]

I could extract the first element of the list:

text = "aa33bbb44"
re.findall("d+",text)[0]

"33"

But that only works if there is at least one match, otherwise I"ll get an error:

text = "aazzzbbb"
re.findall("d+",text)[0]

IndexError: list index out of range

In which case I could define a function:

def return_first_match(text):
    try:
        result = re.findall("d+",text)[0]
    except Exception, IndexError:
        result = ""
    return result

Is there a way of obtaining that result without defining a new function?

Answer rating: 129

You could embed the "" default in your regex by adding |$:

>>> re.findall("d+|$", "aa33bbb44")[0]
"33"
>>> re.findall("d+|$", "aazzzbbb")[0]
""
>>> re.findall("d+|$", "")[0]
""

Also works with re.search pointed out by others:

>>> re.search("d+|$", "aa33bbb44").group()
"33"
>>> re.search("d+|$", "aazzzbbb").group()
""
>>> re.search("d+|$", "").group()
""

Answer rating: 57

If you only need the first match, then use re.search instead of re.findall:

>>> m = re.search("d+", "aa33bbb44")
>>> m.group()
"33"
>>> m = re.search("d+", "aazzzbbb")
>>> m.group()
Traceback (most recent call last):
  File "<pyshell#281>", line 1, in <module>
    m.group()
AttributeError: "NoneType" object has no attribute "group"

Then you can use m as a checking condition as:

>>> m = re.search("d+", "aa33bbb44")
>>> if m:
        print("First number found = {}".format(m.group()))
    else:
        print("Not Found")


First number found = 33




Get Solution for free from DataCamp guru