2015-12-16 11 views
6

il mio scopo di questo codice è estrarre tutti gli interi dal testo e sommarli insieme.Trova tutte le occorrenze di intero all'interno del testo in Python

Sono stato alla ricerca di soluzioni per estrarre tutti gli interi in una riga di testo. Ho visto alcune soluzioni che suggeriscono di utilizzare \D e \b, ho appena iniziato con le espressioni regolari e ancora non ho familiarità con come può inserirsi nel mio codice. Si prega di aiutare :(

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

si esegue un ciclo nei dati di ridefinire i dati ?? –

+0

È possibile controllare il collegamento, ma la maggior parte dei numeri sono separati da spazi – Kelvinlimjk

risposta

4

Puoi farlo riga per riga, chiamare findall utilizzando il modello "\d+" per una o più cifre ed estendere la vostra lista di uscita:

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

uscita:

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

Puoi anche usare str.isdigit:

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

Se si desidera solo per sum i numeri, non è necessario memorizzare tutti i numeri a tutti:

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

uscita:

435239 

o utilizzando un regex:

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

P robably irrilevante nel tuo caso, ma se si voleva evitare eventuali liste intermedie usando python2 è possibile utilizzare itertools.imap:

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

Grazie mille per aver dedicato del tempo! – Kelvinlimjk

+0

@ Kelvinlimjk, prego. –

+0

Perché devi fare la somma due volte? Qual è la prima somma? (somma (somma ...)) – Kelvinlimjk

5
  1. È necessario chiamare read del valore di ritorno della urllib2.urlopen; Il valore di ritorno di urllib2.urlopen non è una stringa, ma
  2. applicare solo un oggetto di connessione (oggetto simile a file) re.findall al data.
  3. parentesi quadre intorno \d non sono necessari.

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

Non è necessario chiamare leggere, è possibile scorrere su linea per linea proprio come un oggetto file –

+1

@PadraicCunningham, Hai ragione. Ho dimenticato che è un oggetto simile a un file. Grazie per il commento. – falsetru

+0

Grazie mille! Scusa ho scelto la risposta di Padriac perché mi ha aiutato a rispondere alla parte di sommatoria. – Kelvinlimjk

1

Dal momento che lei ha citato si voleva sommare tutti i numeri interi, questo funzionerà in Python 3 (come urllib2 è stato diviso tra diverse moduli in Python 3 denominati urllib.request e 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) 
Problemi correlati