Регулярное выражение Python: использование чередования для наборов слов с разделителем

Я хочу сопоставить строку, для которой строковые элементы должны содержать только определенные символы:

  • Первый персонаж из [A,C,K,M,F]
  • Затем следует число (число с плавающей точкой или целое число). Допустимые случаи: 1,2,5,3,6,9,0,6,3 и т. Д.
  • Окончание любой из этих римских цифр [I, II, III, IV, V].

Регламент, который я поставляю, следующий

bool(re.match(r'(A|C|K|M|F){1}\d+\.?\d?(I|II|III|IV|V)$', test_str))

"(I|II|III|IV|V)" часть вернет истину для test_str='C5.3IV' но я хочу, чтобы это было правдой, даже если две римские цифры присутствуют одновременно с разделителем / т. е. запрос регулярного выражения должен возвращаться к истине для test_str='C5.3IV/V' также.

Как я должен изменить регулярное выражение?

Спасибо

2 ответа

Решение

Попробуй это:

bool(re.match(r'[ACKMF]\d+\.?\d?(I|II|III|IV|V)(/(I|II|III|IV|V))*$', test_str))

Я также изменил начало вашего выражения с (A|C|K|M|F){1} в [ACKMF] Символы в квадратных скобках образуют класс символов. Такой класс соответствует одному символу из ряда вариантов. Вы чаще всего видите их с такими диапазонами, как [A-Z0-9] чтобы соответствовать заглавным буквам или цифрам, но вы также можете добавить отдельные символы, как я сделал для вашего регулярного выражения.

Сгруппируйте разделитель и римскую цифру и обращайтесь с ней так же, как с десятичной точкой в ​​выражении с плавающей запятой / int (вы не знаете, будет ли он отображаться или нет, но он появится только один раз). Надеюсь это поможет!

Другие вопросы по тегам