First of all you don't need two regex expressions to pluck out the two values for name and age.
>>> s = "my name is Marco and i'm 24 years old"
>>> pattern = r"my name is\s+(.+)\s+and i'm\s+(\d+)\s+years old"
>>> m = re.match(pattern, s)
>>> print(m.groups())
('Marco', '24')
And you can use a list comprehension to construct the new list:
>>> data = ["my name is Marco and i'm 24 years old", "my name is Jhon and i'm 30 years old"]
>>> new_list = [re.match(pattern, s).groups() for s in data]
>>> print(new_list)
[('Marco', '24'), ('Jhon', '30')]
The result is a list of tuples. If you really need a list of lists you can do this:
new_list = [list(re.match(pattern, s).groups()) for s in data]
The list comprehension is short hand for this loop:
new_list = []
for s in data:
m = re.match(pattern, s)
if m:
new_list.append(m.groups())
The main difference between this loop and the list comprehension is that the former can handle strings that do not match the pattern, whereas the list comprehension assumes that the pattern will always match (an exception will result if it doesn't match). You can handle this in the list comprehension, however, it starts to get ugly as you will need to perform the regex match twice: once to check whether the pattern matched, and then again to extract the actual values. In this case I think that the explicit for loop is cleaner.