Seite 1 von 1

Reguläre Ausdrücke mit Python

Verfasst: Sonntag 8. Juli 2007, 10:12
von lord.hong
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]

Verfasst: Sonntag 8. Juli 2007, 10:31
von birkenfeld
Wo kommt denn die Aufgabe her? Ich würde nämlich sagen, als Aufgabe zum Lernen von REs ist sie überhaupt nicht geeignet.

Verfasst: Sonntag 8. Juli 2007, 10:34
von Costi
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:)

Verfasst: Sonntag 8. Juli 2007, 10:54
von Drake
//edit: Sorry, hab mich verlesen.

Gruß,
Marc

Verfasst: Sonntag 8. Juli 2007, 10:57
von Costi
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.


;-)

Verfasst: Sonntag 8. Juli 2007, 11:09
von gerold
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
:-)

Verfasst: Sonntag 8. Juli 2007, 11:51
von lord.hong
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?

Verfasst: Sonntag 8. Juli 2007, 11:59
von BlackJack
Das was Du nicht verstehst ist eine "list comprehension".

Verfasst: Sonntag 8. Juli 2007, 12:13
von gerold
Und hier noch ein Link zu diesem Thema:
http://docs.python.org/tut/node7.html#S ... 0000000000

Verfasst: Sonntag 8. Juli 2007, 12:16
von Y0Gi
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.

Verfasst: Sonntag 8. Juli 2007, 12:26
von Leonidas
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.