2015-12-16 8 views
6

mein Zweck dieses Codes ist es, alle Ganzzahlen aus dem Text zu extrahieren und sie zusammenzufassen.Finden Sie alle Vorkommen von Ganzzahl in Text in Python

Ich habe nach Lösungen gesucht, um alle Ganzzahlen in einer Textzeile auszuspulen. Ich sah einige Lösungen, die vorschlugen, \D und \b zu verwenden, ich fing gerade mit dem regelmäßigen Ausdruck an und noch nicht vertraut damit, wie es in meinen Code passen kann. Bitte helfen :(

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

Sie Schleife in Daten als Daten neu zu definieren ?? –

+0

Sie können den Link auschecken, aber die meisten Zahlen sind durch Leerzeichen getrennt – Kelvinlimjk

Antwort

4

Sie können es durch die Linie tun Linie, rufen findall das Muster "\d+" für eine oder mehrere Ziffern und Erweiterung Ihrer Ausgabeliste:

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

Ausgang:

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

Sie könnten auchverwenden:

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

Wenn Sie nur die Zahlen sum wollen, müssen Sie nicht überhaupt alle Zahlen speichern:

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

Ausgang:

435239 

Oder ein mit Regex:

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

P robably irrelevant in Ihrem Fall aber, wenn Sie irgendwelche Vermittler-Listen mit python2 Sie itertools.imap vermeiden wollten verwenden:

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

Vielen Dank für Ihre Zeit! – Kelvinlimjk

+0

@ Kelvinlimjk, gern geschehen. –

+0

Warum musst du die Summe zweimal machen? Wofür ist die erste Summe? (Summe (Summe ...)) – Kelvinlimjk

5
  1. Sie rufen müssen read des Rückgabewertes der urllib2.urlopen; Der Rückgabewert von urllib2.urlopen ist kein String, sondern ein Verbindungsobjekt (Datei-ähnliche Objekt)
  2. Wenden Sie einfach re.findall zum data.
  3. Eckige Klammern um \d sind nicht erforderlich.

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

Sie müssen nicht lesen lesen, können Sie zeilenweise wie ein Dateiobjekt iterieren –

+1

@PadraicCunningham, Sie haben Recht. Ich habe vergessen, dass es sich um ein dateiähnliches Objekt handelt. Danke für den Kommentar. – falsetru

+0

Vielen Dank! Entschuldigung, ich habe Padriacs Antwort ausgewählt, weil er geholfen hat, den Summationsteil zu beantworten. – Kelvinlimjk

1

Da Sie erwähnen Sie alle Zahlen fassen wollten, dies funktionieren wird in Python 3 (wie urllib2 wird aufgeteilt über mehrere Module in Python 3 genannt urllib.request und 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) 
Verwandte Themen