Zahl in String finden (gelöst)

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

Wenn eine Zahl alles bis zum nächsten Nicht-Digit ist, würde ich's so machen:

Code: Alles auswählen

In [11]: s = 'Die ganze Zahl 5. Hausnummer 43-45. Localhost = 120.0.0.1'

In [12]: re.findall('\d+', s)
Out[12]: ['5', '43', '45', '120', '0', '0', '1']
Bei Beachtung möglicher Vorzeichen so:

Code: Alles auswählen

re.findall('[+-]?\d+', s)
Spätestens ab hier wird's aber speziell und es bedarf einer Äußerung des OP, was Zahlen im weitesten Sinne sein sollen. Ein passendes Beispiel wäre wie immer hilfreich. :)

EDIT:
Nergal hat geschrieben:Das Problem ist nun nur noch, daß ich nicht im vorraus weiß, welche Zahl vorhanden ist. Format ist immer x.x.x....
Soll x.x.x als zusammenhängender String aufgenommen werden oder jede Zahl einzeln?

Also "bla1.2.3blupp" als ['1', '2', '3'] oder als '1.2.3'?

EDIT2: Oh, wurde ja schon ziemlich an Anfang gelöst. :oops:
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hab dazu mal ne schnelle Frage, darum schreibe ich sie mal drunter:

Will IP Adressen Filtern, und hab (noch) so keine Ahnung von Regulären Ausdrücken

Code: Alles auswählen

s="Zwei IP Adresse: Nr 1 : 192.168.2.1 und Nr 2 : 10.0.0.1"
print re.findall("[0-9\.]+",s)
>> ['1', '192.168.2.1', '2', '10.0.0.1']
Findet meinte IP Adressen, aber auch die Zahlen die keine sind?

Und, warum:

Code: Alles auswählen

print re.findall("[0-9\.*]",s)
>> Liefert alle Zahlen

Code: Alles auswählen

print re.findall("[0-9\.]*",s)
>> Liefer auch noch alle Leerzeichen und keine Punkte?
Zuletzt geändert von da.dom am Freitag 17. Oktober 2008, 08:49, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@da.dom:

Code: Alles auswählen

re.findall('((?:\d{1,3}[.]){3}\d{1,3})', s)
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

snafu hat geschrieben:@da.dom:

Code: Alles auswählen

re.findall('((?:\d{1,3}[.]){3}\d{1,3})', s)
*schnauf* Kannst du dir die Mühe machen und einige Zeichen erklären?

?: >> Vertehe bei dem Punkt die Doku nicht besonders gut
\d >> alle decimalen Zeichen (alternativ mit demselben Ergebnis: [0-9]?)
{1,3} >> Wiederholung, Zahl kann 1-3 mal vorkommen
die Klammern um den ersten Ausdruck >> Gruppierung die 3 mal vorkommen kann, also 3Zahlen mit einem . darf 3 mal vorkommen, und das letzte Element hat keinen FolgePunkte, also kommt das noch mal dahinter (\d{1.3}
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

da.dom hat geschrieben:?: >> Vertehe bei dem Punkt die Doku nicht besonders gut
Gibt es nicht als Gruppe aus, auch wenn es als Gruppe definiert werden musste. Probier's mal ohne. ;)
da.dom hat geschrieben:\d >> alle decimalen Zeichen (alternativ mit demselben Ergebnis: [0-9]?)
Richtig, matcht wenn das Zeichen eine Zahl ist. "d" steht hierbei für "digit".
da.dom hat geschrieben:{1,3} >> Wiederholung, Zahl kann 1-3 mal vorkommen
Ganz genau.
da.dom hat geschrieben:die Klammern um den ersten Ausdruck >> Gruppierung die 3 mal vorkommen kann, also 3Zahlen mit einem . darf 3 mal vorkommen, und das letzte Element hat keinen FolgePunkte, also kommt das noch mal dahinter (\d{1.3}
So siehts auch. Warum fragst du überhaupt? ;)

Übrigens weiß ich das ganz nur, weil ich vor ein paar Tagen fast die selbe Frage gestellt habe: http://www.python-forum.de/topic-16358.html
BlackJack

@da.dom: ``re.findall("[0-9\.]*",s)`` liefert keine Leerzeichen sondern leere Zeichenketten. Das Muster passt halt auch auf leere Zeichenketten und die leere Zeichenkette steht zwischen jedem Zeichen. Und natürlich werden Punke gefunden.

Letztlich musst Du sowieso noch eine Funktion schreiben, die die Treffer vom regulären Ausdruck überprüft, denn ein regulären Ausdruck, der wirklich nur IPs findet, ist recht aufwändig und nicht mehr wirklich lesbar.
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Auch hierfür findest du zwei Lösungsvorschläge im gerade genannten Thread (ich glaube auf Seite 3).
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Tut mir Leid das ich schon wieder nerve und den (eigentlich schon beendeten) Post am leben erhalte, hab mich inzwischen ein bisschen mit den Expressions beschäftigt, aber irgendwie steige ich da nicht ganz durch. Hab mir alle möglichen Parsing Übungen überlegt, bei der hier scheitere ich, bzw. weiss gar nicht ob das so direkt überhaupt möglich ist:

Code: Alles auswählen

htmlString="Something and a URL <a href=\"http://www.google.de\">Zurück</a></p> and not really a URL <img src=\"http://www.bilderspace.de\">"

print re.findall("(<a href.*?>)",htmlString)
#>> ['<a href="http://www.google.de">']
Will aus einer HTML-Zeile, die Links herraus parsen. Soweit bin ich gekommen, um die Links teoretisch weiter verarbeiten zu können, müsste ich ja jetzt die HTML Tags entfernen, kann man so was direkt beim findall machen? Also quasi, finde den Ausdruck und gib mir das .* zurück :D ?

danke (schon wieder)
D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Setze runde Klammern um das ``.*``, also ``(.*)``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Verwende doch einfach direkt ein Modul, das HTML parsen kann. Das Problem in meinem Fall/Thread war ja eigentlich nur, dass ich keinen IP Parser kenne. Es gibt da so nen Spruch, den ich wohl nicht mehr ganz auf die Reihe kriege. Aber er lautet in etwa: "You want to solve a problem with regular expressions? Now you got two problems." Anders gesagt: In den Fällen wo bereits fertige Lösungen zum Parsen eines bestimmten Formats existieren, sollte man auch möglichst auf diese zurückgreifen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:"You want to solve a problem with regular expressions? Now you got two problems."
JWZ hat geschrieben:Some people, when confronted with a problem, think “I know, I'll use regular expressions.”

Now they have two problems.
Quelle.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten