#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'
, тогда как мое — нет.