Reguläre Ausdrücke mit Python

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
lord.hong
User
Beiträge: 26
Registriert: Samstag 19. August 2006, 12:32

Hallo,

ich wollte mir Reguläre Ausdrücke mit Python beibringen.

Jetzt mache ich schon eine Stunde rum und verliere langsam die Lust.

Die erste Aufgabe lautet:
Use a regular expression to count the number of digits in a string.
Diese zwei Strings benutze ich zum Testen

Code: Alles auswählen

testString1 = "This is a test string with 23 as number."
testString2 = "The number 4711 is now on the beginning of this sentence."
Wie könnte der reguläre Ausdruck lauten, der mir die Anzahl der Zahlen wieder gibt?

Danke,
Markus[/b]
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wo kommt denn die Aufgabe her? Ich würde nämlich sagen, als Aufgabe zum Lernen von REs ist sie überhaupt nicht geeignet.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ich wuerds so machen:

Code: Alles auswählen

len(filter(lambda n: n.isdigit(), "The number 4711 is now on the beginning of this sentence."))
wie`s mit regex geht weiss ich auch nicht.
ich denke man braucht damit aber schon mehr als eine zeile
(aber das spielt bei trockenen hausaufgaben keine rolle :lol:)
cp != mv
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

//edit: Sorry, hab mich verlesen.

Gruß,
Marc
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

die aufgabenstellung lautet:
Use a regular expression to count[\b] the number of digits in a string.

und nicht
Use a regular expression to filter the numbers in a string.


;-)
cp != mv
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

So schwer ist es ja gar nicht, wenn man weiß wie es geht. ;-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import re

test_string = "This is a test string with 23 as number."

# Langsam bei vielen Wiederholungen, da der Pattern jedes mal neu kompiliert wird
print len(re.findall("\d", test_string))

# Schnell bei vielen Wiederholungen, da der Pattern nur einmal kompiliert wird
re_c = re.compile("\d")
print len(re_c.findall(test_string))

# Meine bevorzugte Variante (mit ListComprehension)
print len([ char for char in test_string if char.isdigit() ])

# Komplett ohne Magie
counter = 0
for char in test_string:
    if char.isdigit():
        counter += 1
print counter
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lord.hong
User
Beiträge: 26
Registriert: Samstag 19. August 2006, 12:32

birkenfeld hat geschrieben:Wo kommt denn die Aufgabe her? Ich würde nämlich sagen, als Aufgabe zum Lernen von REs ist sie überhaupt nicht geeignet.
Die Aufgabe kommt aus "How to program Python" von Deitel & Deitel. Leider etwas älter (Apr. 2002), aber ich hatte mir das Buch mal während meiner Studienzeit gekauft.

@Georg:
Einerseits gefällt mir die Lösung sehr gut, weil sie so simple ist. Anderseits hat das Buch nur die Funktionen re.compile, re.match, re.search, re.split und re.sub vorgestellt.

Ich bin heute morgen kurz über die Doku von re geflogen (http://docs.python.org/lib/module-re.html) und muss nun zugeben, ja, da steht es. (jetzt wo ich es weiß)

Lösung 1, 2 und 4 verstehe ich ohne Probleme.

Mit deiner bevorzugten Variante, habe ich Probleme. Ich erkenne, dass die Methode len aufgerufen wird. Aber dann!
Die For-Schleife geht über den String und die If-Anweisung stellt fest, ob es sich um eine Zahl handelt.

Was mir zur Zeit nicht klar ist, warum stimmt die Syntax nicht mit der Python Syntax? Kein Doppelpunkt hinter for und if, kein Anweisungblock (hier hätte ich erwartet wird gezählt, wie in Lösung 4).
Warum char vor for und das Ganze (muss ich das nun groß schreiben) in eckigen Klammern?
BlackJack

Das was Du nicht verstehst ist eine "list comprehension".
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Und hier noch ein Link zu diesem Thema:
http://docs.python.org/tut/node7.html#S ... 0000000000
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Die Aufgabe ist in der Tat merkwürdig, wenn es primär um das Erlernen von Regex geht - mit Zählen haben die nämlich nicht so viel am Hut.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lord.hong hat geschrieben:Ich erkenne, dass die Methode len aufgerufen wird. Aber dann!
Die For-Schleife geht über den String und die If-Anweisung stellt fest, ob es sich um eine Zahl handelt.
Die ``for``-Schleife geht über den String, über jedes Zeichen einzeln und prüft mithilfe von ``if`` ob das gegebene Zeichen eine Zahl ist. Wenn ja, wird es der Liste hinzugefügt, die die LC zurückgibt. LCs sind Listengeneratoren, sie geben immer eine neue Liste zurück, deswegen stechen sie ja auch wie Listen in eckigen Klammern.
lord.hong hat geschrieben:Was mir zur Zeit nicht klar ist, warum stimmt die Syntax nicht mit der Python Syntax? Kein Doppelpunkt hinter for und if, kein Anweisungblock (hier hätte ich erwartet wird gezählt, wie in Lösung 4).
Warum char vor for und das Ganze (muss ich das nun groß schreiben) in eckigen Klammern?
Die eckigen Klammern bedeuten ``hier kommt eine LC``, und die Syntax ist so angepasst, dass sie angenehmer zu tippen ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten