如何检查一个字符串只包含数字和/在python中?

时间:2016-02-01 13:14:23

标签: python string if-statement

我正在尝试检查字符串是否只包含/和数字,以用作验证形式,但是我找不到并且两种方式都可以。 ATM我有这个:

if Variable.isdigit() == False:

这适用于数字,但我还没有找到检查斜杠的方法。

6 个答案:

答案 0 :(得分:4)

您可以使用以下正则表达式。

import re

matched = re.match(r'^-?[0-9/]+$', '01/02/2016')
if matched:
    print 'Matched integers with slashes'

答案 1 :(得分:3)

有许多选项,如此处所示。一个不错的是列表推导。

让我们考虑两个字符串,一个满足标准,另一个不满足:

>>> match = "123/456/"
>>> no_match = "123a456/"

我们可以使用isdigit()和比较:

来检查它们的字符是否匹配
>>> match[0].isdigit() or match[0] == '/'
True

但我们想知道所有字符是否匹配。我们可以使用list comprehensions

获取结果列表
>>> [c.isdigit() or c == '/' for c in match]
[True, True, True, True, True, True, True, True]
>>> [c.isdigit() or c == '/' for c in no_match]
[True, True, True, False, True, True, True, True]

请注意,不匹配字符串的列表在False字符的相同位置有'a'

由于我们希望所有字符匹配,我们可以使用all() function。它需要一个值列表;如果其中至少有一个为假,则返回false:

>>> all([c.isdigit() or c == '/' for c in match])
True
>>> all([c.isdigit() or c == '/' for c in no_match])
False

奖励积分

加入一项功能

最好将它放在一个函数上:

>>> def digit_or_slash(s):
...     return all([c.isdigit() or c == '/' for c in s])
... 
>>> digit_or_slash(match)
True
>>> digit_or_slash(no_match)
False

生成器表达式

Generator expressions往往效率更高:

>>> def digit_or_slash(s):
...     return all(c.isdigit() or c == '/' for c in s)
... 

但在你的情况下,它无论如何都可以忽略不计。

in怎么样?

我更愿意使用in运算符,如下所示:

>>> def digit_or_slash(s):
...     return all(c in "0123456789/" for c in s)

请注意,这只是其中一个选项。遗憾的是,Zen of Python recommendation>>> import this):

导致您的问题失败
  

应该有一种 - 最好只有一种 - 显而易见的方法。

但是没关系,现在你可以选择你喜欢的任何东西:)

答案 2 :(得分:1)

使用正则表达式:

import re
if re.match("[0-9/]+$", variable):
    pass # do something

re.match检查变量是否与开头的表达式匹配。表达式由字符类[0-9/](数字和斜杠),+(表示一次或多次)和美元符号组成,它代表行尾,因此它确保string不仅以数字(或斜杠)开头,而且还保持匹配字符类直到结束。

答案 3 :(得分:0)

您可以使用for循环来检查char-by-char

def check(text):

   for char in text:
       if not (char.isdigit() or char == '/'):
           return false

   return true

if check(you_text):
    print("OK")

如果你需要不同的字符,你可以使用带有允许字符的列表或文本 - 类似于:

def check(text):

   for char in text:
       if char not in "0123456789/":
           return false

   return true

答案 4 :(得分:0)

只是另一个想法。

>>> set('01/02/2016') <= set('0123456789/')
True
>>> set('01/02 2016') <= set('0123456789/')
False

答案 5 :(得分:0)

您也可以使用列表理解和any()函数

来完成此操作
In [1]: mystring = '01/02/2016'

In [2]: all(c in '0123456789/' for c in mystring)
Out[2]: True