Вы можете добавить lookahead , чтобы убедиться, что есть цифра или J
, Q
, K
или A
буква:
import re
row = '2SASKS6SJSQSOS'
pattern = r"(?=[0-9JQKA])(1?[0-9]?[JQKA]?)([SHDC])"
result = [x.group() for x in re.finditer(pattern, row)]
print(result) # => ['2S', 'AS', 'KS', '6S', 'JS', 'QS']
Или даже
result = re.findall(r"(?=[0-9JQKA])1?[0-9]?[JQKA]?[SHDC]", row)
См. Демоверсию Python
Это работает, потому что шаблон второй группы не совпадает с тем, что соответствует первой группе.
См. График регулярных выражений 1022 *:

Детали
(?=[0-9JQKA])
- положительный прогноз, требующий цифры ASCII, J
, Q
, K
или A
непосредственно справа от текущего местоположения
1?
- опционально 1
[0-9]?
- дополнительная цифра ASCII
[JQKA]?
- необязательное письмо от класса символов: J
, Q
, K
или A
[SHDC]
- S
, H
, D
или C
буква.