stri = "abcd"
regex1 = "(?P<group1>ab)|(?P<group2>cd)"
regex2 = "(?P<group1>ab).*(?P<group2>cd)"
y = re.match(regex1,stri)
if y:
if y.group("group1"):
print y.group("group1")
if y.group("group2"):
print y.group("group2")
Первое регулярное выражение (регулярное выражение 1) будет соответствовать только группе 1, поскольку экземпляр y может принять только одно совпадение регулярного выражения в обоих случаях, и, очевидно, это будет первое совпадение. Второе (regex2) может соответствовать обеим группам, потому что это будет один и тот же объект соответствия для group1 и group2.
Если вы хотите захватить обе группы с помощью '|'сам оператор, то вы можете сделать это как
regex1 = re.compile("(?P<group1>ab)|(?P<group2>cd)")
for y in regex1.finditer(stri):
if y.group("group1"):
print y.group("group1")
if y.group("group2"):
print y.group("group2")