这个相对忠实的音译对我很有用:
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)
最有可能的是,您可以使用一个更具python风格的列表理解,但是上面的方法非常适合您的代码。
它有一个缺点-它不会停止在第一场比赛,但会评估所有的比赛之前返回第一。