Эта относительно точная транслитерация работает для меня:
import re
patterns = [
re.compile("([a-zA-Z\\d]{9}-[a-zA-Z\\d]{3})"),
re.compile("([a-zA-Z\\d]{3}-[a-zA-Z\\d]{3}-\\d{4}-\\d{2})"),
re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
re.compile("([a-zA-Z\\d]{3}-[a-zA-Z\\d]{3}-\\d{4}-\\d{2})"),
re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
re.compile("([a-zA-Z\\d!]{2,3}-[a-zA-Z\\d]{2,4}-[a-zA-Z\\d]{3,5}-[\\d]{1,2})"),
re.compile("([a-zA-Z\\d]{3,6}-[a-zA-Z\\d]{3}-[\\d]{1,6})"),
re.compile("([a-zA-Z\\d]{3,6}-[a-zA-Z\\d]{4}-[\\d]{1,6})")
]
sku = "123456789-AAA"
res = filter(lambda x: x is not None, map(lambda x: x.match(sku), patterns))
print res[0].group(1)
Скорее всего, вы могли бы использовать более глубокое понимание списков Pythonic, но приведенный выше подход очень сильно отражает ваш код.
Он имеетодин недостаток - он не останавливается на первом совпадении, но оценивает все совпадения перед возвратом первого.