Регулярное выражение Python: удаление или сохранение отрицательных букв в начале - PullRequest
0 голосов
/ 27 января 2020

Цель состоит в том, чтобы сохранить кардинальные и порядковые номера в начале строки, если они находятся непосредственно перед словом PERFORMANCE или SCORE:

#These numbers are kept:
100 SCORE FOR STUDENT
80 PERFORMANCE FOR TEACHER

Однако, если числа в начале и следующее слово отличается, то их следует удалить:

#These numbers are removed
10095TH 10097TH 179TH SCHOOL ANIVERSARY
11 12 10 SECONDARY LEVELS
100 100 100 100 SCHOOL AGREEMENT

У меня возникает проблема, когда перед словом PERFORMANCE или SCORE стоят цифры, разделенные пробелом:

#All numbers should be kept
3 10 100 PERFORMANCE
001 10 12345 SCORE

Я применяю следующее регулярное выражение, но последний раздел запутан (?!\s*\d*\s*\d*\s*(?:PERFORMANCE|SCORE)\b), потому что в настоящее время он рассматривает только 3 набора чисел до сохранения PERFORMANCE или SCORE:

(?<=[A-Za-z]\b )([ 0-9]*(ST|[RN]D|TH)?\b)|^(([\d ]+(ST|[RN]D|TH)?)*\b)(?!\s*\d*\s*\d*\s*(?:PERFORMANCE|SCORE)\b)

Предыдущее регулярное выражение работает для следующего:

3 10 100 PERFORMANCE
001 10 12345 SCORE

Но оно не будет работать, если я добавлю дополнительный набор цифр:

3 10 100 1 PERFORMANCE
001 10 1 12345 SCORE

Как можно обобщить это правило включить весь набор цифр?

Спасибо

1 Ответ

3 голосов
/ 27 января 2020

Попробуйте следующее:

^(?:\d+(?:ST|[RN]D|TH)?\s)+(?=[^\d]+$)(?!PERFORMANCE|SCORE)
^                       anchor to beginning
(?:                     start non-capturing group
    \d+                 match one or more digits
    (?:ST|[RN]D|TH)?    optionally followed by one of your approved suffixes
    \s                  then a whitespace
)+                      one or more times
(?=[^\d]+$              assert that the rest of the line is number-free (forces the regex to not backtrack to the last number)
(?!PERFORMANCE|SCORE)   assert that the following characters are NOT 'PERFORMANCE' or 'SCORE' 
...