Нахождение «старшей карты» в покерной руке с регулярным выражением - PullRequest
1 голос
/ 12 ноября 2019

Карты в покере ранжируются следующим образом:

A>K>Q>J>T>9>8>7>6>5>4>3>2 # Ace, King, Queen, Jack, Ten, 9, ...

Текущее регулярное выражение, которое я должен найти «старшую карту» в руке, выглядит следующим образом:

>>> re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'

ЭтоМожно ли сделать вышеупомянутое без такого чередования? Я попытался записать 9-2 как [9-2], но кажется, что классы персонажей нужно упорядочивать по возрастанию, и в этом случае он не будет правильно определять старшую карту. Какое будет правильное / лучшее регулярное выражение для приведенного выше примера?

Примечание: приведенный выше пример неверен - правильный ответ должен быть «А», а не «К». Вот обновленная попытка:

>>> re.search('.*(A)|.*(K)|.*(Q)|.*(J)|.*(T)|.*(9)|.*(8)|.*(7)|.*(6)|.*(5)|.*(4)|.*(3)|.*(2)', '2Q3AK').group(1)
'A'

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Почему это не так : регулярное выражение

re.search('.*(A|K|Q|J|T|9|8|7|6|5|4|3|2)','2Q3AK').group(1)
'K'

соответствует жадности. Он сопоставляет столько символов для .*, сколько может, и затем выплевывает последний символ:

re.search('.*(A|Q|J|T|9|8|7|6|5|4|3|2|K)','KQ3A2').group(1)
'2'

В качестве испытания кадра, есть ли конкретная причина, по которой вам нужно использовать reза это? Похоже, это было бы более явно и, вероятно, легче понять, просто найти самый упорядоченный символ:

order = 'AKQJT98765432'
hand = '2Q3AK'
highest = min(hand, key=order.index)
0 голосов
/ 12 ноября 2019

Может быть, стоит рассмотреть и другие методы, не относящиеся к регулярным выражениям, например, Counter или OrderedDict:

from collections import Counter, OrderedDict

l = ['A', 'K', 'Q', 'J', 'T', 9, 8, 7, 6, 5, 4, 3, 2]

string = '2Q3AK'

c = Counter(string)

for i in l:
    if i in c:
        print(i)
        break

Output

A

Этотак быстро, как регулярное выражение, если это будет проблемой, и это может быть столь же элегантно, как это тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...