Моя цель этого кода состоит в том, чтобы извлечь все целые числа из текста и суммировать их вместе.

Я искал решения, чтобы вытащить все целые числа в строке текста. Я видел несколько решений, предлагающих использовать \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
6
Kelvinlimjk 16 Дек 2015 в 18:01

3 ответа

Лучший ответ

Вы можете делать это построчно, вызывая findall, используя шаблон "\d+" для одной или нескольких цифр и расширяя свой список вывода:

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))
4
Padraic Cunningham 16 Дек 2015 в 15:27

Поскольку вы упомянули, что хотите сложить все целые числа, это будет работать в Python 3 (так как urllib2 был разбит на несколько модулей в Python 3 с именами urllib.request и urllib.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)
1
N. Wouda 16 Дек 2015 в 15:16
  1. Вам нужно вызвать read возвращаемого значения urllib2.urlopen; Возвращаемое значение urllib2.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]
5
falsetru 16 Дек 2015 в 15:24