检测字符串中的数字

时间:2011-07-11 11:01:41

标签: python

value = 'ad.41.bd'

if len(value) == len(value.strip({0,1,2,3,4,5,6,7,8,9})):
    # no numbers
else:
    # numbers present

有一种更简洁的方法可以在Python中检测字符串中的数字吗?

7 个答案:

答案 0 :(得分:14)

这个怎么样?

import re
if not re.search('\d+', value):
    # no numbers
else:
    # numbers present

答案 1 :(得分:8)

>>> value="ab3asdf"
>>> any(c.isdigit() for c in value)
True
>>> value="asf"
>>> any(c.isdigit() for c in value)
False




>>> value = 'ad.41.bd'
>>> any(map(lambda c:c.isdigit(),value))
True

编辑:

>>> value="1"+"a"*10**6
>>> any(map(lambda c:c.isdigit(),value))
True
>>> from itertools import imap
>>> any(imap(lambda c:c.isdigit(),value))
True

地图花了1秒钟(在旧的python上) imap是即时的,因为imap返回一个生成器。请注意,在现实世界中,数字位于文件名末尾的概率较高。

答案 2 :(得分:4)

from string import digits
def containsnumbers(value):
    return any(char in digits for char in value)

编辑:

只是为了彻底:

任何(c.isdigit()):

>>> timeit.timeit('any(c.isdigit() for c in value)', setup='value = "abcd1"')
1.4080650806427002

任何(数字c):

>>> timeit.timeit('any(c in digits for c in value)', setup='from string import digits; value = "abcd1"')
1.392179012298584

re.search(1位或更多位数):

>>> timeit.timeit("re.search('\d+', value)", setup='import re; value = "abcd1"')
1.8129329681396484

re.search(停在一位数后):

>>> timeit.timeit("re.search('\d', value)", setup='import re; value = "abcd1"')
1.599431037902832

re.match(非贪婪):

>>> timeit.timeit("re.match(r'^.*?\d', value)", setup='import re; value = "abcd1"')
1.6654980182647705

re.match(贪婪):

>>> timeit.timeit("re.match(r'^.*\d', value)", setup='import re; value = "abcd1"')
1.5637178421020508

任何(地图()):

>>> timeit.timeit("any(map(lambda c:c.isdigit(),value))", setup='value = "abcd1"')
1.9165890216827393

任何(IMAP()):

>>> timeit.timeit("any(imap(lambda c:c.isdigit(),value))", setup='from itertools import imap;value = "abcd1"')
1.370448112487793

通常,较不复杂的regexp运行得更快。 c.isdigit()c in digits几乎相同。 re.match略快于re.searchmap()是最慢的解决方案,但imap()是最快的(但在any(c.isdigit)any(c in digits)的舍入误差范围内。

答案 3 :(得分:3)

您可以使用regular expression

import re
# or if re.search(r'\d', value):
if re.match(r'^.*?\d', value):
    # numbers present
else:
    # no numbers

答案 4 :(得分:1)

if not any(c.isdigit() for c in value)
    # no numbers
else:
    # numbers present

答案 5 :(得分:1)

要检测数字中的符号,请使用?运算符。

import re
if not re.search('-?\d+', value):
    # no numbers
else:
    # numbers present

答案 6 :(得分:0)

如果您想知道差异有多大,可以使用re.sub()

import re
digits_num = len(value) - len(re.sub(r'\d','',value))
if not digits_num:
    #without numbers
else:
    #with numbers - or elif digist_num == 3