【问题标题】:Find all occurrences of integer within text in Python在 Python 中查找文本中所有出现的整数
【发布时间】:2016-03-22 18:50:52
【问题描述】:

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

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

import re
import urllib2

data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt")
aList = []

for word in data:
    data = (str(w) for w in data)
    s = re.findall(r'[\d]+', word)
    if len(s) != 1: continue
    num = int(s[0])
    aList.append(num)

print aList

【问题讨论】:

  • 你循环输入数据而不是重新定义数据??
  • 可以查看链接,但大部分数字用空格隔开

标签: python regex string substring


【解决方案1】:

您可以逐行执行,使用模式"\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]

你也可以使用str.isdigit:

l = []
for line in data:
     l.extend(map(int,(w for w in line.split() if w.isdigit())))

如果您只想sum 号码,则根本不需要存储所有号码:

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

输出:

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))

【讨论】:

  • 非常感谢您抽出宝贵的时间!
  • 为什么要计算两次?第一笔钱是干什么用的? (sum(sum ...))
  • @Kelvinlimjk,我们将内部和中的每一行数字相加,然后外部和将所有这些和相加
【解决方案2】:
  1. 你需要调用read的返回值urllib2.urlopenurllib2.urlopen的返回值不是字符串,而是连接对象(类文件对象)
  2. 只需将re.findall 应用到data
  3. \d 周围的方括号不是必需的。

import re
import urllib2

data = urllib2.urlopen("http://python-data.dr-chuck.net/regex_sum_179860.txt").read()
int_list = map(int, re.findall(r'\d+', data))

>>> int_list
[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]

【讨论】:

  • 你不需要调用read,你可以像文件对象一样逐行迭代
  • @PadraicCunningham,你是对的。我忘了它是一个类似文件的对象。感谢您的评论。
  • 非常感谢!抱歉,我选择了 Padriac 的答案,因为他帮助回答了总结部分。
【解决方案3】:

既然你提到你想对所有整数求和,这将在 Python 3 中工作(因为urllib2 在 Python 3 中被拆分为多个名为 urllib.requesturllib.error 的模块):

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2017-02-21
    • 1970-01-01
    • 2020-05-24
    • 2012-07-18
    相关资源
    最近更新 更多