string nach zahlen scannen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

hallo,

ich habe einen string z.B '56\t89\t78\n'
wobei dieser aus einer datei eingelesen wird.
nun möchte ich aus diesem string die zahlen extrahieren und in eine neue liste schreiben, damit man mit den zahlen rechnen kann?

danke
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Entweder RE findall mit \d oder eine for Schleife drüber, mit readlines und .split("\t"), und nachsehen ob es eine Zahl ist, z.B. mit if x in string.digits...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

danke, aber wenn ich z.B folgenden String habe:

'1.155E+3\r1.157E+3\r1.131E+3'

und ich re.findall('\d',"...")

dann kriege ich natürlich:
['1', '1', '5', '5', '3', '1', '1', '5', '7', '3', '1', '1', '3', '1', '3']

wie kriege ich denn aber:

['1.155E+3','1.157E+3','1.131E+3']

ich befürchte, dass es eine einfachere art gibt eine datei auszulesen...

leider funktionierts mit load nicht (--->load von pylab) da meine einträge in der datei aus zeilen und leerzeile und spalten ... bestehen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

OK, dann ist RE vielleicht keine gute Idee ;)

Versuche erstmal die Daten in einer For Schleife auseinander zu pflücken. Also mit readlines() einlesen und dann mit spit() arbeiten.

Die Zahlen selber sind ja erstmal Strings. Du kannst diese mit int(), long(), float() usw. umwandeln, siehe: http://docs.python.org/dev/library/stdt ... pesnumeric

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

ok, also mit re.findall geht es, wenn man

re.findall('\d{3}\E\+\d{1}',"STRING")

macht, ist aber ein wenig unflexibel, sollte sobald man eine größere zahl hat nicht funktionieren...:)

ich versuch mal,dass was du eben vorgeschlagen hast
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sollte doch machbar sein! Du suchst eine Zahl, die von einem Punkt gefolgt sein muss, dann beliebig viele Zahlen, dann ein "E+" und dann beliebig viele Zahlen.
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Kurze Frage zum Dateiformat:

Kann es sein, das es sich dabei um eine Datei im TSV-Format handelt ?

(TSV = Tab Separated Values, ein Verwandter des CSV-Formats in dem als Trennzeichen zwischen den Spalten ein Tab-Zeichen verwendet wird)

Wenn ja: So weit ich weiss, kann man dem CSV-Reader das verwendete Trennzeichen angeben ...
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Für solche Fälle ist Regexp::Commonf für Perl toll:
http://search.cpan.org/perldoc?Regexp::Common
Einzusetzen wie folgt:

Code: Alles auswählen

 perl -MRegexp::Common -e 'print  $RE{num}{real}' 
Und das dann copy&paste bei Python rein, kurz testen und ab dafür.
Die sind in aller Regel kompatibel zu Python.
BlackJack

Kann es sein, dass ein einfaches ``map(float, line.split())`` pro Zeile ausreicht!?
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

jo, hab diverse sachen ausprobiert!

am besten funktioniert map!

nun stehe ich vor einem "fast peinlichen" problem...

hier der code:

Code: Alles auswählen

#!/usr/bin/python
from pylab import *
import string
in_file = open("/home/user1/uni/python/data.dat",'r')

data_string = in_file.readlines() 

for i in range(0,len(data_string)):
	a = map(float, data_string[i].split())
	print a
else:
	print "fertig \n",a
	
	
wie kriege ich es hin, dass am ende eine liste mit allen einträgen die im if block gemacht wurden entsteht,
denn "print a" zeigt nur die letze bearbeitete zeile an

vereinfacht meine ich:
sum = sum +x

macht man sowas mit append?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

#!/usr/bin/python
import pylab as lab

in_file = open("/home/user1/uni/python/data.dat",'r')
data= in_file.read()

numbers = map(float, data.split())
oder, deinem näher:

Code: Alles auswählen

numbers = []
for line in in_file:
    number += map(float, data_string[i].split())
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

danke! es funzt!
Antworten