web-dev-qa-db-ja.com

Python整数の正規表現?

私は正規表現を学んでいますが、Pythonの正規表現を使用して整数のみを定義します-整数ではなく小数ではありません。

\dを使用して数値のみを許可するものを作成できましたが、10進数も許可します。

price = TextField(_('Price'), [
    validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
    validators.Optional()]) 

コードをonlyに変更して整数を許可するにはどうすればよいですか?

23

正規表現は文字ベースで動作し、\dは10進数ではなく1桁の0...9を意味します。

符号付きの整数のみに一致する正規表現は、たとえば

^[-+]?[0-9]+$

意味

  1. ^-文字列の開始
  2. [-+]?-オプション(これは?の意味)マイナス記号またはプラス記号
  3. [0-9]+-1つ以上の数字(プラス記号は「1つ以上」を意味し、[0-9]\dを表す別の方法です)
  4. $-文字列の終わり

注:数値のみを解析する必要がある場合にのみ、符号を数値の一部と見なしても問題ありません。式を処理するより一般的なパーサーの場合、数値から符号を除外する方が適切です。そうしないと、3-2などのソースストリームが、整数、演算子、別の整数ではなく、2つの整数のシーケンスとして解析される可能性があります。私の経験では、より高いレベルで単項否定演算子を絶えず折り畳むことで、負の数をより適切に処理できます。

78
6502

anchor 文字列の最初と最後の正規表現が必要です:

^[0-9]+$

説明:

^      # Start of string
[0-9]+ # one or more digits 0-9
$      # End of string
13
Tim Pietzcker

Djangoを使用しているようです。

おそらくmodels.IntegerField()の代わりにmodels.TextField()を使用する方が良いでしょう。チェックを行うだけでなく、いくつかの言語に翻訳されたエラーメッセージを表示し、データベースの型の値をPythonの型にキャストします透過的にコード。

8
e-satis

_^[-+]?[0-9]+$_では_0_で始まる文字列が許可されるため、^[-+]?([1-9]\d*|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'))
_
2
sira