2015-12-16 2 views
6

моя цель этого кода - извлечь все целые числа из текста и суммировать их вместе.Найти все вхождения целого числа в тексте в Python

Я искал решения для вырезания всех целых чисел в строке текста. Я видел некоторые решения, предлагающие использовать \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 
+1

You цикл в данных, чем переопределить данные ?? –

+0

Вы можете проверить ссылку, но большинство номеров разделены пробелами – Kelvinlimjk

ответ

4

Вы можете сделать это построчно, вызовите 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 

Или с помощью regex:

print(sum(sum(map(int,r.findall(line))) for line in data)) 

P robably не имеет значения в вашем случае, но если вы хотите, чтобы избежать каких-либо промежуточных списков с помощью python2 можно использовать itertools.imap:

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

Огромное вам спасибо за то, что вы не торопитесь! – Kelvinlimjk

+0

@ Kelvinlimjk, пожалуйста. –

+0

Зачем вам делать эту сумму дважды? Для чего нужна первая сумма? (сумма (сумма ...)) – Kelvinlimjk

5
  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] 
+1

Вам не нужно вызывать чтение, вы можете перебирать строки за строкой, как файловый объект –

+1

@PadraicCunningham, вы правы. Я забыл, что это файл-подобный объект. Спасибо за комментарий. – falsetru

+0

Большое вам спасибо! Извините, я выбрал ответ Падриака, потому что он помог ответить на суммирующую часть. – Kelvinlimjk

1

Поскольку вы упомянули вы хотите просуммировать все целые числа, это будет работать в 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) 
Смежные вопросы