有没有更好的方法来查找字符串是否包含数字?

aen*_*nsm 15 python string

我正在使用包含数字和字母数字的字符串,或仅包含数字,但不仅仅是alpha.为了测试错误匹配,我需要检查字符串是否包含至少一个数字,如果没有则打印错误消息.我一直在使用以下代码:

s = '0798237 sh 523-123-asdjlh'

def contains_digits(s):
    for char in list(s):
        if char.isdigit():
            return True
            break
    return False

if contains_digits(s) == True:
    print s
else:
    print 'Error'
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic或更简单的方法,或者这是否足够?另外,我不能只检查字符串是否是字母数字,因为字符串可能包含各种符号(' - ',空格等)

Mar*_*ers 40

这是正则表达式就是这样的地方之一:

_digits = re.compile('\d')
def contains_digits(d):
    return bool(_digits.search(d))
Run Code Online (Sandbox Code Playgroud)

小演示:

>>> _digits = re.compile('\d')
>>> def contains_digits(d):
...     return bool(_digits.search(d))
... 
>>> contains_digits('0798237 sh 523-123-asdjlh')
True
>>> contains_digits('sh asdjlh')
False
Run Code Online (Sandbox Code Playgroud)

您可以使用@ Wallacolloo的答案中描述的any方法,但这比简单的正则表达式慢:.isdigit()

>>> import timeit
>>> timeit.timeit("contains_digits('0798237 sh 523-123-asdjlh')", 'from __main__ import contains_digits')
0.77181887626647949
>>> timeit.timeit("contains_digits_any('0798237 sh 523-123-asdjlh')", 'from __main__ import contains_digits_any')
1.7796030044555664
Run Code Online (Sandbox Code Playgroud)

if方法与正则表达式相同:

>>> timeit.timeit("contains_digits_if('0798237 sh 523-123-asdjlh')", 'from __main__ import contains_digits_if')
0.87261390686035156
Run Code Online (Sandbox Code Playgroud)

但如果数字出现在文本的后面,情况会变得更糟:

>>> timeit.timeit("contains_digits('asdjlhtaheoahueoaea 11 thou')", 'from __main__ import contains_digits')
1.202538013458252
>>> timeit.timeit("contains_digits_any('asdjlhtaheoahueoaea 11 thou')", 'from __main__ import contains_digits_any')
5.0348429679870605
>>> timeit.timeit("contains_digits_if('asdjlhtaheoahueoaea 11 thou')", 'from __main__ import contains_digits_if')
3.707183837890625
Run Code Online (Sandbox Code Playgroud)

Timings在Mac OS X 10.7上的python 2.6上测试过.


Pon*_*dle 12

使用该any函数,传递一个序列.
如果序列的任何元素为真(即在这种情况下是数字),则any返回True,否则返回False.https://docs.python.org/library/functions.html#any

def contains_digits(s):
    return any(char.isdigit() for char in s)
Run Code Online (Sandbox Code Playgroud)

如果您担心性能,那么您当前的方法实际上更快.

  • @aensm:的确,python字符串也是[序列](http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange). (3认同)