Ищете регулярное выражение, которое может найти все комбинации чисел без 3 нулей между ними и смешанных с разделителями

Я хотел бы найти все комбинации чисел без 3 нулей между ними. Между числами могут быть некоторые разделители (максимум 2 символа). Я использую python, и я хотел бы выполнить этот поиск с помощью регулярного выражения.

Принятые номера

This is number 1234 which should be accepted.
12-45
1 2 0 0  3 4 5

не принимаются номера:

1
12
123
1000
1000-2000
30000-31000
21 000-32 000-50 000
21 00 03 00 00

Регулярное выражение, которое я мог бы придумать, это:

([\s\-]{0,2}\d(?!000)){4,}

Мое регулярное выражение может найти все принятые номера, но не отфильтровывает все исключенные номера.

Смотрите результаты в регулярном выражении

На самом деле это регулярное выражение используется в python для удаления совпадающих чисел из текста: См. код Python

p.s. Разделители - это не только пробелы, они должны быть как минимум \s и тире.

p.s.s. Цифры могут быть в середине строки. Поэтому я думаю, что не могу использовать ^ и $ в своем регулярном выражении.

Каковы все принятые разделители?

Tim Biegeleisen 25.12.2020 11:15

Попробуйте ^(?:[1-9 -]|(?<!0)0(?!0))+$regex101.com/r/7qo5Hx/1

The fourth bird 25.12.2020 11:17

Или попробуйте ^(?!.*0(?:[\s-]{0,2}0){2})[0-9\s-]+$, смотрите regex101.com/r/1GUuVv/1

Wiktor Stribiżew 25.12.2020 12:34

@TimBiegeleisen Разделители здесь не обсуждаются, но я использую \s, а также \- для разделителей

HmT 25.12.2020 13:03

@WiktorStribiżew и Thefourthbird: Спасибо за ответ, но я боюсь, что эти регулярные выражения у меня не работают. Я обновил вопрос и добавил дополнительную информацию и тестовые примеры.

HmT 25.12.2020 14:21

Сейчас это выглядит довольно громоздко: (?<![^-\s])(?!(?:\d(?:[\s-]{0,2}\d)*?)?0(?:[\s-]{0,2}0){2})[‌​0-9](?:[\s-]{0,2}[0-‌​9]){3,}(?![^-\s]), см. regex101.com/r/6fgemU/1

Wiktor Stribiżew 25.12.2020 14:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете утверждать не 3 нуля подряд, сопоставляя необязательные разделители между ними.

\b(?![\d\s-]*?0(?:[\s-]*0){2})\d(?:[\s-]*\d){3,}\b

Объяснение

  • \b Граница слова
  • (?! Отрицательный взгляд вперед, утверждение, что то, что справа, не
    • [\d\s-]*? Совпадение с любой цифрой, символом пробела или - как минимум
    • 0(?:[\s-]*0){2} - ) Соответствует нулю, за которым следует 2 раза ноль с необязательными разделителями между ними
  • \d Сопоставьте цифру
  • (?:[\s-]*\d){3,} Повторите 3 или более раз, чтобы найти цифру с необязательными разделителями между ними.
  • \b Граница слова

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

Это работает в большинстве случаев, но есть несколько проблем: 1. Я не хочу использовать ^ и $, потому что числа могут быть в середине текста 2. Я добавил \s вместо пробела в разделителях, а также удалил ^ и $ . и убирает только два лишних нуля из принятых чисел

HmT 25.12.2020 13:43

Кстати, к моему первоначальному вопросу был добавлен простой скрипт Python и ссылки (по вашей ссылке) :)

HmT 25.12.2020 13:50

он также удаляет все числа длиной менее 4 цифр. Я также добавил эти тестовые числа к исходному вопросу.

HmT 25.12.2020 14:15

@HmT Попробуйте так \b(?=[ -]*\d)(?![\d -]*?0(?:[ -]*0){2})\d(?:[ -]*\d){2,}\bregex101.com/r/NLFyjG/1

The fourth bird 25.12.2020 14:23

да, намного лучше, но все же он фиксирует 3 цифры. Я обновил тестовые случаи: regex101.com/r/NLFyjG/2

HmT 25.12.2020 14:34

@HmT, вы можете увеличить квантификатор regex101.com/r/d0CQnn/1

The fourth bird 25.12.2020 15:21

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