Регулярное выражение, разрешающее только отрицательное число в десятичных дробях и 0

#regex #regex-group #regexp-replace

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

Вопрос:

Нужно регулярное выражение, которое допускает только 0 и отрицательные числа. Приведенное ниже выражение также допускает положительные числа.

 ^-?[0-9]d*(.d )?$
  

Ответ №1:

Я бы использовал здесь чередование:

 ^(?:0(?:.0 )?|-d (?:.d )?)$
  

ДЕМОНСТРАЦИЯ

 ^(?:                from the start of the input
    0(?:.0 )?      match 0, or 0.0, 0.00 etc.
    |               OR
    -d (?:.d )?  match a negative number, with optional decimal component
)$                  end of the input
  

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

1. Это соответствует '0' в '00cat' . Проблема, как вы сразу увидите, заключается в том, что привязка ^ применяется только к первой части чередования и $ только к последней части чередования. Головастик, да?

2. Нет, совсем нет.

Ответ №2:

Я предлагаю вам использовать регулярное выражение

 r'^(?:0|-(?:0.d |[1-9]d*(?:.d )?))$'
  

Запустите свой движок!

Это соответствует: '0' , '-0.123 , '-0.000 '0.123 , '-17 '-29.33 , ,, и '-29.00'

Оно не соответствует: '00' , '-017' , '12' и '44.7' .

Механизм регулярных выражений Python выполняет следующие операции.

 ^                : match beginning of string
(?:              : begin non-capture group
  0              : match '0'
  |              : or
  -              : match '-'
    (?:          : begin a non-capture group
      0.d      : match '0.' then 
      |          : or
      [1-9]d*   : match a digit other than zero then 0  digits
      (?:.d )  : match '.' then 1  digits in a non-capture group
      ?          : make the non-capture group optional
    )            : end non-capture group
)                : end non-capture group
$                : match end of string
  

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

1. @Тим, ты, должно быть, шутишь. Мой ответ, конечно, не был идентичен вашему, когда я опубликовал, поскольку ваш был неправильным. Более того, ваше регулярное выражение по-прежнему совпадает с '00' и '-017' , тогда как мое — нет.