私は正規表現を学んでいますが、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に変更して整数を許可するにはどうすればよいですか?
正規表現は文字ベースで動作し、\d
は10進数ではなく1桁の0
...9
を意味します。
符号付きの整数のみに一致する正規表現は、たとえば
^[-+]?[0-9]+$
意味
^
-文字列の開始[-+]?
-オプション(これは?
の意味)マイナス記号またはプラス記号[0-9]+
-1つ以上の数字(プラス記号は「1つ以上」を意味し、[0-9]
は\d
を表す別の方法です)$
-文字列の終わり注:数値のみを解析する必要がある場合にのみ、符号を数値の一部と見なしても問題ありません。式を処理するより一般的なパーサーの場合、数値から符号を除外する方が適切です。そうしないと、3-2
などのソースストリームが、整数、演算子、別の整数ではなく、2つの整数のシーケンスとして解析される可能性があります。私の経験では、より高いレベルで単項否定演算子を絶えず折り畳むことで、負の数をより適切に処理できます。
anchor 文字列の最初と最後の正規表現が必要です:
^[0-9]+$
説明:
^ # Start of string
[0-9]+ # one or more digits 0-9
$ # End of string
Djangoを使用しているようです。
おそらくmodels.IntegerField()
の代わりにmodels.TextField()
を使用する方が良いでしょう。チェックを行うだけでなく、いくつかの言語に翻訳されたエラーメッセージを表示し、データベースの型の値をPythonの型にキャストします透過的にコード。
_^[-+]?[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'))
_