Как я могу написать регулярное выражение, которое находит все, кроме 4-значных чисел, таких как 2000, 1990 или 1234?

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть такой текст:

 Film_relase_date:1970_films_by_20th_Century_Fox
 

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

 Film_relase_date:_films_by_20th_Century_Fox
 

Я пробовал с регулярным выражением:

 [^d{4}]
 

Но это регулярное выражение возвращает:

 Film_relase_date:_films_by_th_Century_Fox
 

И, следовательно, также исключает 20, которые вместо этого я хотел бы сопоставить.
Как я могу улучшить регулярное выражение?

РЕДАКТИРОВАТЬ: я хочу использовать это регулярное выражение для выполнения чего-то вроде:

 x = 'Film_relase_date: 1970_films_by_20th_Century_Fox'

REPLACE (x, "Anything that is not a 4-digit number", "Non-Space") = 1970
 

Комментарии:

1. Вы можете сопоставить (?<!d)d{4}(?!d) и заменить пустой строкой regex101.com/r/PWE1Kk/1

2. Большое вам спасибо! Да, это работает, но как мне отменить выражение? Мне нужно регулярное выражение, чтобы исключить 4-значное число из текста. Я использую это регулярное выражение в функции ЗАМЕНЫ, где я хочу заменить все, что не является 4-значным числом, на не-пробел

3. Глядя на желаемый результат re.sub(r"(?<!d)d{4}(?!d)", "", "Film_relase_date:1970_films_by_20th_Century_Fox") , см. ideone.com/CrNcIo

4. Будет ли ваш текст всегда следовать тому же шаблону, где вы хотите удалить 4 символа после двоеточия?

5. Да, именно, число, которое меня интересует, всегда находится в этом формате. Я не очень хорошо объяснил себя, я имею в виду, что регулярное выражение должно быть примерно таким: REPLACE («все, что не является 4-значным числом», «Не пробел») = 4-значное число. Извините, это моя вина, я был недостаточно ясен, спасибо всем за советы до сих пор!

Ответ №1:

Помните, что {4} это должно быть добавлено after в класс символов, а не внутри.

В любом случае, если вы хотите сопоставить «весь текст, кроме 1970», вы можете использовать следующее регулярное выражение:

 ([^d]|(?<!d)d(?!d{3}(?!d))d*)?
 

смотрите демонстрацию.

Это регулярное выражение соответствует:

  • нецифровый символ или
  • символ цифры, которому не предшествует другая цифра, и за ним не следует ровно 3 цифры

Комментарии:

1. Это не сработает regex101.com/r/taKWuj/1

2. Вы правы, потому что b не разделяет d от подчеркивания.

3. Кажется, это правильное решение! Большое спасибо!

Ответ №2:

Если вы хотите сопоставить все, кроме 4 цифр, я бы предложил развернутую версию, соответствующую либо 1-3, либо 5 цифрам, утверждающим, что за цифрой не следует цифра, чтобы предотвратить последовательное совпадение цифр.

Если вы не хотите пересекать новые строки, вы можете использовать [^drn] вместо D

 D (?:(?:d{1,3}|d{5,})(?!d)D*)*
 

Объяснение

  • D Сопоставьте 1 не цифры
  • (?: Не группа захвата
    • (?:d{1,3}|d{5,}) Сопоставьте 1-3, 5 или более цифр
  • (?!d)D* Отрицательный прогноз, не указывайте цифру прямо справа, за которой следуют соответствующие необязательные не цифры
  • )* Закройте группу без захвата и повторите 0 раз

Демонстрация регулярных выражений

Обратите внимание, что если вы хотите сопоставить только 4 цифры, возможно, вы могли бы извлечь 4 цифры, используя (?<!d)d{4}(?!d) вместо замены пустую строку.

Смотрите другую демонстрацию регулярных выражений