регулярное выражение для соответствия последовательности символов и только одного типа символа - PullRequest
2 голосов
/ 22 марта 2020

У меня есть регулярное выражение для сопоставления последовательностей символов. я хочу, чтобы он совпадал только в том случае, если используется один тип разделителя (пробел, "/" или "-"), а не комбинация всех.

^(([1-9]|1[0-3]|A|J|Q|K|a|j|q|k)(C|D|H|S|c|d|h|s))( |\-|\/)(([1-9]|1[0-3]|A|J|Q|K|a|j|q|k)(C|D|H|S|c|d|h|s))( |\-|\/)(([1-9]|1[0-3]|A|J|Q|K|a|j|q|k)(C|D|H|S|c|d|h|s))( |\-|\/)(([1-9]|1[0-3]|A|J|Q|K|a|j|q|k)(C|D|H|S|c|d|h|s))( |\-|\/)(([1-9]|1[0-3]|A|J|Q|K|a|j|q|k)(C|D|H|S|c|d|h|s))

, например, i хотите, чтобы он совпадал:

as/3d/0S/Td/13C

, но не:

As/3d-QS/Ad/13C

или:

As-2d QS/Td 13C

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Во-первых, вы можете значительно упростить регулярное выражение, оно будет более читабельным

  • (C|D|H|S|c|d|h|s) -> [CDHScdhs]
  • ([1-9]|1[0-3]|A|J|Q|K|a|j|q|k) -> ([1-9]|1[0-3]|[AJQKajqk])
  • ( |\-|\/) -> [ \/-]

Затем вы можете использовать обратная ссылка , чтобы убедиться, что используется тот же разделитель, он представляет индекс группы для используйте, после упрощения, это группа 2 в моем регулярном выражении посмотрите

Также, поскольку все части одинаковы, вы могли бы упростить в

^([1-9]|1[0-3]|[AJQKajqk])[CDHScdhs]([ \/-])(([1-9]|1[0-3]|[AJQKajqk])[CDHScdhs]\2?)+$

Но установив флаг re.IGNORECASE, вы можете удалить заглавные буквы

^([1-9]|1[0-3]|[ajqk])[cdhs]([ \/-])(([1-9]|1[0-3]|[ajqk])[cdhs]\2?)+$

==> FINAL REGEX

2 голосов
/ 22 марта 2020

Заменить все, кроме первого вхождения этого ( |-|/) в \4. Таким образом, вы ссылаетесь на то, что было найдено первым, и ожидаете этого везде. ( демо )

0 голосов
/ 22 марта 2020

Решение без регулярных выражений выглядит намного чище:

def check_string(the_string):
    # return True if exactly two of ' ', '-', '/' do not appear in the_string
    counters = [the_string.count(' '), the_string.count('/'), the_string.count('-')]
    return counters.count(0) == 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...