Python, regex - как сопоставить вторую группу, только если сопоставляется первая группа - PullRequest
1 голос
/ 12 июня 2019

Ввод:

2SASKS6SJSQSOS

Ожидаемый вывод:

2S AS KS 6S JS QS

Мой код:

import re

row = input()

pattern = r"([1]?[0-9]?[JQKA]?)([SHDC])"

result = ''

for (first, second) in re.findall(pattern, row):
    if first and second:
        result += first + second + ' '

print(result)

Так что на данный момент работает , потому что эта проверка do the magic:

if first and second:

Без этой проверки возвращается:

2S AS KS 6S JS QS S 

потому что это соответствует второй группе.

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

1 Ответ

1 голос
/ 12 июня 2019

Вы можете добавить 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 *:

enter image description here

Детали

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