Стоит отметить, что механизм регулярных выражений прекращает активный поиск, как только находит совпадение. Затем порядок имеет значение в определенных ситуациях, потому что он не будет продолжать проверять оставшиеся опции в чередовании.
Цель этого регулярного выражения состоит из двух разделов:
- Удалить числа в начало строки, если эти числа находятся не сразу перед KINDER, SECONDARY, ELEMENTARY . Это просто, мы можем достичь этого с помощью следующего:
(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))
- Сложить вместе цифры и буквы, которые составили порядковый номер (объяснено в здесь ). Например, строки, такие как
10 st
, становятся 10st
, но такие строки, как abcdefg238947 th
, НЕ меняются. Соответствующее регулярное выражение следующее: (?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))
Проблема возникает при сложении этих двух вместе. Я понимаю, что если я установлю второе правило на первое место, то двигатель будет работать успешно и продолжит синтаксический анализ:
text= re.sub(r'(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))|(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))',
'',
'1 ST KINDER',
0,
re.IGNORECASE)
Имея следующую строку, двигатель должен установить вместе 1
и ST
. Тогда наличие 1ST
перед KINDER не должно совпадать со вторым правилом, но это не так:
1 ST KINDER --> ST KINDER
Дополнительные примеры:
10306 KINDER (OK)
12345 ABC (OK)
1 ST KINDER (SHOULD BE 1ST KINDER)
1 AB KINDER (OK)
Как я могу установить вместе в ЖЕ Выражение regex с чередованием обоих правил, отдавая приоритет соединению цифр и букв, если они порядковые, а затем проверяет наличие цифр в начале?