在Python中查找文本中出现的所有整数

在Python中查找文本中出现的所有整数,python,regex,string,substring,Python,Regex,String,Substring,我编写这段代码的目的是从文本中提取所有整数,并将它们相加 我一直在寻找在一行文本中提取所有整数的解决方案。我看到一些建议使用\D和\b的解决方案,我刚开始使用正则表达式,还不知道它如何适合我的代码。请帮助:( 您需要调用read,读取urlib2.urlopen的返回值;urlib2.urlopen的返回值不是字符串,而是连接对象(类似文件的对象) 只需将re.findall应用于数据 \d周围不需要方括号 您可以逐行执行,使用一个或多个数字的模式“\d+”调用findall,并扩展输出列表

我编写这段代码的目的是从文本中提取所有整数,并将它们相加

我一直在寻找在一行文本中提取所有整数的解决方案。我看到一些建议使用
\D
\b
的解决方案,我刚开始使用正则表达式,还不知道它如何适合我的代码。请帮助:(

  • 您需要调用
    read
    ,读取
    urlib2.urlopen
    的返回值;
    urlib2.urlopen
    的返回值不是字符串,而是连接对象(类似文件的对象)
  • 只需将
    re.findall
    应用于
    数据
  • \d
    周围不需要方括号



  • 您可以逐行执行,使用一个或多个数字的模式
    “\d+”
    调用
    findall
    ,并扩展输出列表:

    import re
    import urllib2
    
    data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt")
    r = re.compile("\d+")
    l = []
    for line in data:
        l.extend(map(int,r.findall(line)))
    
    输出:

    [3524, 9968, 6177, 3133, 6508, 7940, 3738, 1112, 6179, 4570, 6127, 9150, 9883, 418, 3538, 2992, 8527, 1150, 2049, 2834, 2630, 3840, 2638,  3800, 9144, 5866, 6742, 588, 6918, 7802, 8229, 7947, 8992, 1339, 
    2119,  846, 3820, 4070, 9356, 9708, 3238, 9380, 5572, 9491, 3038, 
    7434, 7771, 288, 8632, 3962, 9136, 8106, 7295, 3699, 4136, 3459, 8120,
    6018, 8963, 5779, 3635, 3984, 4850, 9633, 2588, 7631, 9591, 1067, 
    7182, 1301, 8041, 1361, 5425, 8326, 7094, 8155, 2581, 7199, 6125, 42]
    
    435239
    
    您还可以使用
    str.isdigit

    l = []
    for line in data:
         l.extend(map(int,(w for w in line.split() if w.isdigit())))
    
    如果您只想对数字进行求和,则根本不需要存储所有数字:

    print(sum(sum(map(int,(w for w in line.split() if w.isdigit()))) for line in data))
    
    输出:

    [3524, 9968, 6177, 3133, 6508, 7940, 3738, 1112, 6179, 4570, 6127, 9150, 9883, 418, 3538, 2992, 8527, 1150, 2049, 2834, 2630, 3840, 2638,  3800, 9144, 5866, 6742, 588, 6918, 7802, 8229, 7947, 8992, 1339, 
    2119,  846, 3820, 4070, 9356, 9708, 3238, 9380, 5572, 9491, 3038, 
    7434, 7771, 288, 8632, 3962, 9136, 8106, 7295, 3699, 4136, 3459, 8120,
    6018, 8963, 5779, 3635, 3984, 4850, 9633, 2588, 7631, 9591, 1067, 
    7182, 1301, 8041, 1361, 5425, 8326, 7094, 8155, 2581, 7199, 6125, 42]
    
    435239
    
    或使用正则表达式:

     print(sum(sum(map(int,r.findall(line))) for line in data))
    
    可能与您的情况无关,但是如果您想避免使用python2的任何中间列表,您可以使用
    itertools.imap

    from itertools import imap
    print(sum(sum(imap(int,r.findall(line))) for line in data))
    

    因为您提到要对所有整数求和,所以这在Python 3中是可行的(因为Python 3中名为
    urllib.request
    urllib.error
    的几个模块中已将
    urllib2
    拆分为多个模块):


    你循环输入数据而不是重新定义数据??你可以检出链接,但大多数数字是用空格分隔的。你不需要调用read,你可以像文件一样逐行迭代object@PadraicCunningham,你说得对。我忘了它是一个类似文件的对象。谢谢你的评论。非常感谢!很抱歉我选择了Padriac的答案,因为他帮助回答了求和部分。非常感谢你花时间!为什么你要做两次求和?第一次求和是为了什么?(求和(求和…)@Kelvinlimjk,我们把每行数的内数求和,外数求和,然后把所有的数求和
    from itertools import imap
    print(sum(sum(imap(int,r.findall(line))) for line in data))
    
    from urllib import request
    import re
    
    
    data = request.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt")
    
    result = 0
    
    for word in data:
        result += sum([int(x) for x in re.findall(r'\d+', str(word))])
    
    print(result)