Zahlen aus String extrahieren

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
Jdoue
User
Beiträge: 2
Registriert: Montag 30. September 2019, 12:39

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!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Jdoue
User
Beiträge: 2
Registriert: Montag 30. September 2019, 12:39

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())   
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

__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.
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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?
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Antworten