寻找更快的方法从字符串中过滤整数 - Python 3.3

时间:2014-01-31 20:30:27

标签: python filter python-3.3

我试图从我写的另一个beautifulsoup脚本收集的数据中剖析出一个整数。 我得到的数据总是以下三个中的一个:

<div id="counts"> 500 hits </div>
<div id="counts">3 hits </div>
<div id="counts"> hits </div>

点击次数各不相同,有时会附加到“&gt;”有时候不是。其他时候整数不存在。所以我写了这个脚本只返回数据中的数字(或告诉我没有数字)。它似乎笨拙而缓慢,我觉得应该有更快的方法来做到这一点? (在这个代码示例中,我将'搜索'作为bs scrape的3种可能结果之一)

keywords = ['hits']
results = []
search = '<div id="hits"> 3 hits </div>'

num_check = False
store_next = False
words = search.split()

def is_number(results, num_check):
    while num_check <= 0:
        try:
            float(results[0])
            num_check = True
        except ValueError:
            results[0] = ''.join(filter(lambda x: x.isdigit(), results[0]))
            if results[0] == '':
                num_check = 2
    if num_check <= 1:
        print(results[0])

for word in reversed(words):
    if store_next:
        results.append(word)
        store_next = False
    elif word in keywords:
        store_next = True

is_number(results, num_check)

编辑:有时(很少)<div></div>包含更多信息,例如ping速度(0.22 seconds),这就是我无法在整个子句中搜索整数的原因。

1 个答案:

答案 0 :(得分:2)

可能

search = '<div id="hits"> 3 hits </div>'
re.findall("\d+",search)

或浮动

re.findall("\d+\.?\d*",search)

如果你知道你一次不会超过一个

re.search("(\d+)",search).group(0)

这是一些时间信息

>>> timeit.timeit("re.search(\"(\d+)\",'<div id=\"hits\"> 3 hits </div>').group(   0)","import re",number = 1000)
0.0031895773144583472
>>> timeit.timeit("filter(str.isdigit, '<div id=\"hits\"> 3 hits </div>')",numbe   r=1000)
0.0049939576031476918
>>>