Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测字符串中的数字_Python - Fatal编程技术网

Python 检测字符串中的数字

Python 检测字符串中的数字,python,Python,Python中有一种更干净的方法来检测字符串中的数字吗?您可以使用: 这个怎么样 import re # or if re.search(r'\d', value): if re.match(r'^.*?\d', value): # numbers present else: # no numbers 编辑: 映射耗时1秒(在旧python上) imap是即时的,因为imap返回一个生成器。注意:在现实世界中,数字出现在文件名末尾的概率更高。如果您想知道差异有多大,可以使用re

Python中有一种更干净的方法来检测字符串中的数字吗?

您可以使用:

这个怎么样

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

映射耗时1秒(在旧python上)
imap是即时的,因为imap返回一个生成器。注意:在现实世界中,数字出现在文件名末尾的概率更高。

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

编辑: 为了彻底起见:

任何(c.isdigit()):

任何(以数字表示的c):

重新搜索(1个或多个数字):

重新搜索(在一位数后停止):

重新匹配(非贪婪):

关于匹配(贪婪):

任何(映射()):

any(imap()):

一般来说,不太复杂的regexp运行得更快
c.isdigit()
c的数字几乎相等<代码>重新匹配
略快于
重新搜索
map()
是最慢的解决方案,但
imap()
是最快的(但舍入误差在
any(c.isdigit)
any(c为数字)

要检测数字中的符号,请使用
操作符

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

看看有多好(或坏)会很有趣与正则表达式相比,它的性能更好。我喜欢
any
,但是
map
首先生成整个列表。如果
value
很大,并且第一个字符是数字,那么这段代码仍然处理整件事。我相信当它找到第一个True时,任何代码都会停止。但是map不会返回生成器(我认为在python 3中除外)所以在内存中创建了一个完整的列表(即使第一个字符是数字)。否则我猜它会非常相似。@robert king,没有创建方法列表的参数。这将始终计算为
True
!使用
value='abc'
any(c.isdigit()表示c的值)进行尝试
使用生成器表达式,省去了lambda和map。您不需要使用
^
锚定表达式,使用
re.search
可能会更好。另外,
*
匹配零个或多个字符,因此
是多余的。@Kirk:我想
search
可能会查找所有位置s匹配这个模式(我只需要一个),而
match
只会在开始时匹配(所以是的,我可以在这里省略
^
)。我想要尽可能短的匹配,因此是
*?
(不贪婪)。很好。在我睡了一会儿,喝了一些咖啡后,我会重新评估。:-)
search
只给出第一个匹配项。我对你的计时进行了调整,发现随着值长度的增加,正则表达式的性能越来越好。@史蒂文:这似乎是合理的,因为它将大量工作转移到了C。我将
value
改为
“abcd”*1000+“9”
并将
number
减少到10000<代码>任何(imap)需要7.588秒,
重新搜索(第一次匹配后停止)需要0.377秒,
任何(数字c)
需要4.283秒。将最后一个重写为
any(数字中的d的值为d)
只需要.310s(当最后一个数字是“1”而不是“9”时是.073s),我想这也是因为它将大部分工作负载推到了核心。
import re
if not re.search('\d+', value):
    # no numbers
else:
    # numbers present
>>> 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
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
from string import digits
def containsnumbers(value):
    return any(char in digits for char in value)
>>> timeit.timeit('any(c.isdigit() for c in value)', setup='value = "abcd1"')
1.4080650806427002
>>> timeit.timeit('any(c in digits for c in value)', setup='from string import digits; value = "abcd1"')
1.392179012298584
>>> timeit.timeit("re.search('\d+', value)", setup='import re; value = "abcd1"')
1.8129329681396484
>>> timeit.timeit("re.search('\d', value)", setup='import re; value = "abcd1"')
1.599431037902832
>>> timeit.timeit("re.match(r'^.*?\d', value)", setup='import re; value = "abcd1"')
1.6654980182647705
>>> 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
>>> timeit.timeit("any(imap(lambda c:c.isdigit(),value))", setup='from itertools import imap;value = "abcd1"')
1.370448112487793
if not any(c.isdigit() for c in value)
    # no numbers
else:
    # numbers present
import re
if not re.search('-?\d+', value):
    # no numbers
else:
    # numbers present