Я хотел бы найти все комбинации чисел без 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. Цифры могут быть в середине строки. Поэтому я думаю, что не могу использовать ^ и $ в своем регулярном выражении.
Попробуйте ^(?:[1-9 -]|(?<!0)0(?!0))+$
regex101.com/r/7qo5Hx/1
Или попробуйте ^(?!.*0(?:[\s-]{0,2}0){2})[0-9\s-]+$
, смотрите regex101.com/r/1GUuVv/1
@TimBiegeleisen Разделители здесь не обсуждаются, но я использую \s, а также \- для разделителей
@WiktorStribiżew и Thefourthbird: Спасибо за ответ, но я боюсь, что эти регулярные выражения у меня не работают. Я обновил вопрос и добавил дополнительную информацию и тестовые примеры.
Сейчас это выглядит довольно громоздко: (?<![^-\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
Вы можете утверждать не 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 вместо пробела в разделителях, а также удалил ^ и $ . и убирает только два лишних нуля из принятых чисел
Кстати, к моему первоначальному вопросу был добавлен простой скрипт Python и ссылки (по вашей ссылке) :)
он также удаляет все числа длиной менее 4 цифр. Я также добавил эти тестовые числа к исходному вопросу.
@HmT Попробуйте так \b(?=[ -]*\d)(?![\d -]*?0(?:[ -]*0){2})\d(?:[ -]*\d){2,}\b
regex101.com/r/NLFyjG/1
да, намного лучше, но все же он фиксирует 3 цифры. Я обновил тестовые случаи: regex101.com/r/NLFyjG/2
@HmT, вы можете увеличить квантификатор regex101.com/r/d0CQnn/1
Каковы все принятые разделители?