Seite 1 von 1

Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 12:51
von Jdoue
Hallo,
Ich bin ein Python Anfaenger und habe Strings aus denen ich gerne nur die Zahlen (Die Menge der Nachkommazahlen und die Vorzeichen variieren.) haette. Durch meine Rechereche bin ich bis jetzt so weit gekommen:

Code: Alles auswählen

import re

str1 = "dict_values(['-4.75051', '0.896874'])"
values=re.findall('\d+.\d+', str1 )

print(values)
>>> ['4.75051', '0.896874']

Dadurch bekomme ich allerdings nur die Betraege der Zahlen.
Hat jemand einen Tipp oder eine Loesung fuer mich um die Zahlen mit Vorzeichen zu bekommen?
Vielen Dank!

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 13:23
von __deets__
Du kannst vor den ersten \d+ einfach ein -? stecken - das sollte ein eventuell vorhandenes Vorzeichen erwischen.

Die Frage die sich mir aber stellt: woher kommt denn diese Textdarstellung? Das sieht so aus, als ob man da auf der erzeugenden Seite deutlich besser vorgehen koennte, und zB gleich ein JSON-Dokument erzeugen. Woher kommen denn die Daten?

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 13:30
von Jdoue
Super Dankeschoen. Ich weiss echt nicht wie ich das nicht hinbekommen habe bzw. nicht selbst darauf kommen konnte.

Die Textdarstellung kommt dadurch, wenn ich aus einer xml Datei versuche Werde auszulesen mit Hilfe von:

Code: Alles auswählen

for scatter in root.findall('scatterplot'):
    print(scatter.get('id'))    # getting the ids of the scatterplot
    my_scatter_id_list.append(scatter.get('id'))        # saving the ids for later use - similar to before


for id_index in range(len(my_scatter_id_list)):
    target_id = my_scatter_id_list[id_index]
    print('Used target id: ', target_id)

    for polygon in root.findall("./scatterplot/[@id='{0}']/polygon//".format(target_id)):
        print(polygon.attrib.values())   

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 13:33
von Jankie

Code: Alles auswählen

import re

str1 = "dict_values(['-4.75051', '0.896874'])"
values=re.findall('-?\d+.\d+', str1 )

print(values)
>> ['-4.75051', '0.896874']

kann dein Problem nicht nachvollziehen.


#edit: Vorposter hat den Beitrag geändert.

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 13:37
von __deets__
@Jankie: dein Ausdruck ist ein anderer als der des TE. Kein Wunder, dass du ein anderes Ergebnis hast.

@Jdoeu: das sieht nach web-scraping oder etwas aehnlichem aus. Wenn du aber garantieren kannst, dass die Daten immer die form "dict_values(<hier-kommt-eine-liste>)" haben, wuerde ich stattdessen "dict_values(" und ")" abschneiden, und die ganze Liste mittels des ast-Moduls einlesen.

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 13:39
von Jankie
__deets__ hat geschrieben: Montag 30. September 2019, 13:37 @Jankie: dein Ausdruck ist ein anderer als der des TE. Kein Wunder, dass du ein anderes Ergebnis hast.

@Jdoeu: das sieht nach web-scraping oder etwas aehnlichem aus. Wenn du aber garantieren kannst, dass die Daten immer die form "dict_values(<hier-kommt-eine-liste>)" haben, wuerde ich stattdessen "dict_values(" und ")" abschneiden, und die ganze Liste mittels des ast-Moduls einlesen.
@__deets__: Der Vorposter hatte eben in seinem Beitrag stehen, dass er nur negative Zahlen ausgegeben bekommt. Darauf hat sich mein Ausdruck bezogen.

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 14:15
von Sirius3
@__deets__: kommt halt drauf an, ob das, was übrig bleibt, Python oder JSON ist. Sonst die ganze Liste per json.loads einlesen.

@Jdoue: Über einen Index zu iterieren ist ein Anti-Pattern, in der ersten Schleife hast Du es doch schon richtig gemacht:

Code: Alles auswählen

for target_id in my_scatter_id_list:
    print('Used target id: ', target_id)
    for polygon in root.findall("./scatterplot/[@id='{0}']/polygon//".format(target_id)):
        print(polygon.attrib.values())
Sowohl das my_-Präfix, als auch das _list-Suffix bei my_scatter_id_list haben keinen Mehrwert und können weg. Für Listen wird üblicherweise die Mehrzahl gewählt: scatter_ids.
Warum sind in einer scatter-ids-Liste target_ids?

Re: Zahlen aus String extrahieren

Verfasst: Montag 30. September 2019, 15:06
von snafu
Was ist denn dabei der genaue Hintergrund? Mit der Rückgabe von values() kann man bekanntlich direkt weiterarbeiten und muss nicht mühsam dessen String-Repräsentation parsen. Sollen da zwei Python-Skripte miteinander kommunizieren oder sollen die Daten für längere Zeit gespeichert werden?

Re: Zahlen aus String extrahieren

Verfasst: Dienstag 1. Oktober 2019, 08:09
von Sirius3
@Jdoue: achso, jetzt verstehe ich erst: das ist ein ganz falsches Vorgehen. Die Stringrepräsentation von irgendwelchen Objekten ist nicht dafür gedacht, dass man darauf mit Stringoperationen weiterarbeitet. Diese Repräsentation kann sich leicht mal ändern.

Woher kommt diese XML-Datei, was ist dessen Format?
Die Reihenfolge von Attributen in XML-Dateien ist nicht vorgegeben, die Values können also in beliebiger Reihenfolge kommen. Ich gehe davon dass die Attribute wohl x und y sind, dann mußt Du diese auch explizit Abfragen und Verarbeiten:

Code: Alles auswählen

polygon_points = []
for target_id in my_scatter_id_list:
    print('Used target id: ', target_id)
    for polygon in root.findall("./scatterplot/[@id='{0}']/polygon//".format(target_id)):
        polygon_points .append((polygon.attrib['x'], polygon.attrib['y']))
Mit der Liste kann man dann direkt weiter arbeiten. Was ist der Sinn, diese erst auszugeben?