#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/12. Большое вам спасибо! Да, это работает, но как мне отменить выражение? Мне нужно регулярное выражение, чтобы исключить 4-значное число из текста. Я использую это регулярное выражение в функции ЗАМЕНЫ, где я хочу заменить все, что не является 4-значным числом, на не-пробел
3. Глядя на желаемый результат
re.sub(r"(?<!d)d{4}(?!d)", "", "Film_relase_date:1970_films_by_20th_Century_Fox")
, см. ideone.com/CrNcIo4. Будет ли ваш текст всегда следовать тому же шаблону, где вы хотите удалить 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)
вместо замены пустую строку.
Смотрите другую демонстрацию регулярных выражений