DRY input-checking in python
Yes, abandon input(), which is usually a less powerful and flexible choice.
Here's an approximation of your code using
argparse. Notice several
things: (1) very little repetition in our code; (2) much less algorithmic code,
which means fewer chances for error; (3) greater simplicity overall
and thus higher readability;
(4) good validation and user help messages out of the box; (5) many other
possibilities (see the library's documentation); (6) less hassle for
users to run the code repeatedly or in any kind of automated context;
and (7) less hassle during development of the code, for the same reason.
# Usage examples:

$ python demo.py George Washington 289 --pet
Namespace(age=289, first_name='George', last_name='Washington', pet=True)

# The code:

import argparse
import sys

def main(args):
    ap, opts = parse_args(args)
    print(opts)

def parse_args(args):
    ap = argparse.ArgumentParser()
    ap.add_argument('first_name', type = personal_name)
    ap.add_argument('last_name', type = personal_name)
    ap.add_argument('age', type = int)
    ap.add_argument('--pet', action = 'store_true')
    opts = ap.parse_args(args)
    return (ap, opts)

def personal_name(x):
    if x.isalpha():
        return x
    else:
        raise ValueError(f'Invalid name: {x}')

if __name__ == '__main__':
    main(sys.argv[1:])

But if you cannot or do not want to take that route, the roll-your-own approach
looks similar in spirit: we need a general-purpose function to get input;
it needs to take some type of text or label to tell the user what we are asking
for; and it needs a converter/validator to check the reply.
Here's a rough sketch of the new or different parts:
def main(args):
    d = dict(
        first = get_input(label = 'first name', convert = personal_name),
        last = get_input(label = 'last name', convert = personal_name),
        age = get_input(label = 'age', convert = int),
        pet = get_input(label = 'pet status [y/n]', convert = yesno),
    )
    print(d)

def yesno(x):
    if x in ('yes', 'y'):
        return True
    elif x in ('no', 'n'):
        return False
    else:
        raise ValueError(f'Invalid yes-no: {x}')

def get_input(label, convert):
    while True:
        reply = input(f'Enter {label}: ')
        try:
            return convert(reply)
        except (ValueError, TypeError):
            print('Invalid reply')