Регулярное выражение Python для целого?
Я изучаю регулярные выражения, и я хотел бы использовать регулярное выражение в Python для определения только целых чисел - целых чисел, но не десятичных.
Я мог бы сделать тот, который позволяет только числа, используя \d
, но он также разрешает десятичные числа, которые я не хочу:
price = TextField(_('Price'), [
validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
validators.Optional()])
Как я могу изменить код, чтобы разрешить только целые числа?
Ответы
Ответ 1
Регулярные выражения работают с символьной базой, и \d
означает одну цифру 0
... 9
а не десятичное число.
Например, регулярное выражение, которое соответствует только целым числам со знаком
^[-+]?[0-9]+$
имея в виду
-
^
- начало строки -
[-+]?
- необязательный (это что ?
означает) знак минус или плюс -
[0-9]+
- одна или несколько цифр (плюс означает "одна или несколько", а [0-9]
- другой способ сказать \d
) -
$
- конец строки
Примечание: если считать знак частью номера, то это нормально, только если вам нужно разобрать только номер. Для более общих синтаксических анализаторов, обрабатывающих выражения, лучше оставить знак вне числа: в противном случае исходные потоки, такие как 3-2
могут в конечном итоге быть проанализированы как последовательность из двух целых чисел вместо целого числа, оператора и другого целого числа. Мой опыт показывает, что отрицательные числа лучше обрабатываются постоянным сворачиванием оператора унарного отрицания на более высоком уровне.
Ответ 2
Вам нужно anchor регулярное выражение в начале и конце строки:
^[0-9]+$
Объяснение:
^ # Start of string
[0-9]+ # one or more digits 0-9
$ # End of string
Ответ 3
По-видимому, вы используете Django.
Скорее всего, вам лучше использовать models.IntegerField()
вместо models.TextField()
. Он будет не только проверять вас, но и даст вам сообщение об ошибке, переведенное в несколько языков, и он будет трансформировать значение из его типа в базу данных в тип вашего кода Python.
Ответ 4
Я предпочитаю ^[-+]?([1-9]\d*|0)$
, потому что ^[-+]?[0-9]+$
позволяет строку, начинающуюся с 0
.
RE_INT = re.compile(r'^[-+]?([1-9]\d*|0)$')
class TestRE(unittest.TestCase):
def test_int(self):
self.assertFalse(RE_INT.match('+'))
self.assertFalse(RE_INT.match('-'))
self.assertTrue(RE_INT.match('1'))
self.assertTrue(RE_INT.match('+1'))
self.assertTrue(RE_INT.match('-1'))
self.assertTrue(RE_INT.match('0'))
self.assertTrue(RE_INT.match('+0'))
self.assertTrue(RE_INT.match('-0'))
self.assertTrue(RE_INT.match('11'))
self.assertFalse(RE_INT.match('00'))
self.assertFalse(RE_INT.match('01'))
self.assertTrue(RE_INT.match('+11'))
self.assertFalse(RE_INT.match('+00'))
self.assertFalse(RE_INT.match('+01'))
self.assertTrue(RE_INT.match('-11'))
self.assertFalse(RE_INT.match('-00'))
self.assertFalse(RE_INT.match('-01'))
self.assertTrue(RE_INT.match('1234567890'))
self.assertTrue(RE_INT.match('+1234567890'))
self.assertTrue(RE_INT.match('-1234567890'))