Extract, filter and match three letters from the given arguments and predict the name
I'll show an example implementation first, and then describe it:

from typing import Iterable
import re


def case_rank1_naming(proteins_available: Iterable[str], best_match_protein_name: str) -&gt; str:
    # extract the three-letter pattern
    protein_pattern = re.search(r"[A-Z][a-z]{2}", best_match_protein_name).group()

    # extract the numbers
    best_number = max(
        int(re.search(r"[A-Z][a-z]{2}(\d{1,3})", name)[1])
        for name in proteins_available
    )

    # Add the protein pattern, the next predicted number and 'Aa1' at the suffix
    return f'{protein_pattern}{best_number + 1}Aa1'


def main():
    proteins_available = (
        'Xpp1Aa1', 'Xpp2Aa1', 'Xpp35Aa1', 'Xpp35Ab1', 'Xpp35Ac1',
        'Xpp35Ba1', 'Xpp36Aa1', 'Xpp49Aa1', 'Xpp49Ab1'
    )
    best_match_protein_name = 'Xpp35Ba1'
    predicted_name = case_rank1_naming(proteins_available, best_match_protein_name)
    assert predicted_name == 'Xpp50Aa1'


if __name__ == '__main__':
    main()



Add type hints to better-define your function signature
Don't write {1} in a regex - you can just drop it
Call max immediately on a generator rather than making and sorting a list
Shorten your variable names. Especially don't include the type of the variable in its name. Type hints and appropriate pluralization will cover you instead.
Use f-strings
Have a main function
In main, use a tuple for proteins_available instead of a list because it doesn't need to mutate