Seite 1 von 1

Variablen Problem im Suchmuster

Verfasst: Montag 14. Dezember 2009, 13:25
von orangenbaum
Hallo zusammen,

ich bin hier im Forum, sowie mit dem Umgang mit Python ein absoluter Neuling.

Ich stocke gerade bei folgendem Problem:

Ich möchte in das Suchmuster re.compile("((@.*){(kennwort))") kennwort als variable nutzen. im weiteren verlauf meines programmes lege ich eine weitere variable fest die gleich der 3. suchgruppe meines suchmusters sein soll. python spuckt mir nun an dieser stelle aber einen fehler aus
Traceback (most recent call last):
File "<pyshell#39>", line 10, in <module>
kennwort2= foundreplace.group(3)
AttributeError: 'NoneType' object has no attribute 'group'

ich weiss nicht woran das liegt? hat jemand von euch eine idee?
danke im vorraus
orangenbaum

Verfasst: Montag 14. Dezember 2009, 13:31
von jbs
Du bekomsmt None zurück wenn die re nicht zutrifft.

Verfasst: Dienstag 15. Dezember 2009, 13:47
von orangenbaum
hm ok, aber wie kann ich denn dann die variable in das muster einbauen?
also wie gesagt, das muster ist re.compile("((@.*){(kennwort))") und "kennwort" ist die variable für ein sich wechselndes wort...
weiss da jemand bescheid?
lg

Verfasst: Dienstag 15. Dezember 2009, 13:54
von Hyperion
Stichwort String Formatierung :-)

Die Frage ist natürlich inwiefern dann das compile überhaupt sinnvoll ist...

Verfasst: Dienstag 15. Dezember 2009, 14:16
von orangenbaum
meinst du so:
re.compile("((@.*){(%s))") % kennwort

wenn ich das eingebe kommt der Fehler:
ersetzwort= re.compile("((@.*){(%s))") % kennwort
TypeError: unsupported operand type(s) for %: '_sre.SRE_Pattern' and 'str'

lg

Verfasst: Dienstag 15. Dezember 2009, 14:19
von Zap

Code: Alles auswählen

ersetzwort= re.compile("((@.*){(%s))" % kennwort)  

Verfasst: Dienstag 15. Dezember 2009, 14:22
von /me
orangenbaum hat geschrieben:meinst du so:
re.compile("((@.*){(%s))") % kennwort
Nicht ganz. Der %-Operator muss auf den String angewendet werden und nicht auf das Ergebnis.

Verfasst: Dienstag 15. Dezember 2009, 14:24
von Hyperion
Immer an die Zukunft denken ;-)

Code: Alles auswählen

ersetzwort= re.compile("((@.*)(({0}))".format(kennwort))

Verfasst: Dienstag 15. Dezember 2009, 14:40
von orangenbaum
hmm das mit der zukunft musst du mir newbie erklären^^ aber danke für den tip, hat geholfen:-)

lg

Verfasst: Dienstag 15. Dezember 2009, 14:44
von Hyperion
orangenbaum hat geschrieben:hmm das mit der zukunft musst du mir newbie erklären^^ aber danke für den tip, hat geholfen:-)

lg
Das "".format() ist seit Python 2.6 der Standard fürs Formatieren von Zeichenketten und wird auch so in der 3.x Serie verwendet. Insofern progammiert man damit zukunftsträchtiger als mit der "alten" "%s" % string-Formatierung.

Verfasst: Dienstag 15. Dezember 2009, 14:50
von BlackJack
@Hyperion: Wer hat das zum Standardweg erklärt?

@orangenbaum: Man sollte das `kennwort` besser noch durch `re.escape()` schicken, bevor man es einsetzt. Nur für den Fall, dass es vielleicht mal etwas enthalten könnte, das in regulären Ausdrücken eine besondere Bedeutung hat.

Verfasst: Dienstag 15. Dezember 2009, 14:56
von Hyperion
BlackJack hat geschrieben:@Hyperion: Wer hat das zum Standardweg erklärt?
Ich :-P

Ok, hast ja Recht. Standard ist vielleicht kein so gutes Wort dafür; können wir uns auf "präferierte Methode" einigen?

Verfasst: Dienstag 15. Dezember 2009, 15:02
von Masaru
... wenn Du nochmal sagen kannst "wo" das steht, klar gerne warum nicht.

Verfasst: Dienstag 15. Dezember 2009, 15:09
von orangenbaum
@BlackJack: Danke für den Tip, aber ich glaube, dass dies hier nicht nötig ist, da in dem String wirklich nie ein Sonderzeichen vorkommt. Trotzdem nochmal danke!
lg

Verfasst: Dienstag 15. Dezember 2009, 15:12
von Hyperion
Masaru hat geschrieben:... wenn Du nochmal sagen kannst "wo" das steht, klar gerne warum nicht.
Nirgends - nehme ich mal an :-)

Verfasst: Dienstag 15. Dezember 2009, 15:14
von cofi
Masaru hat geschrieben:... wenn Du nochmal sagen kannst "wo" das steht, klar gerne warum nicht.
Da %-Formatting in Python 3 deprecated wird, bleibt das nur als logischer schluss uebrig ;)
Whats new in Python 3.0 hat geschrieben:PEP 3101: Advanced String Formatting. Note: the 2.6 description mentions the format() method for both 8-bit and Unicode strings. In 3.0, only the str type (text strings with Unicode support) supports this method; the bytes type does not. The plan is to eventually make this the only API for string formatting, and to start deprecating the % operator in Python 3.1

Verfasst: Dienstag 15. Dezember 2009, 15:42
von Masaru
cofi hat geschrieben:Da %-Formatting in Python 3 deprecated wird, bleibt das nur als logischer schluss uebrig ;)
Ah, wusste ich noch gar nicht, danke :).

So ganz steht es Deinem Zitat nach ja aber momentan noch nicht fest cofi:
"...The plan is to eventually make this the only API for string formatting, and to start deprecating the % operator in Python 3.1 ..."

Ich plane auch meinen Keller bis Januar aufzuräumen ... das leider schon seit so an die 3 Jahren :roll: *pfeif*.

>>Masaru<<

Verfasst: Dienstag 15. Dezember 2009, 17:45
von orangenbaum
hallo, ich bins nochmal^^
ich komm immernoch nicht mit dem suchmuster klar, ich hab es jetzt so:
ersetzwort= re.compile("((@.*){(%s),)" % kennwort)

(bei der Variante von Zap kommt bei mir einer Fehler)

Jedoch bindet er aber trotzdem nicht die Variable "Kennwort" in das Muster ein, die Suche ergibt None...
hat jemand eine Idee woran das liegen kann?

lg

Verfasst: Dienstag 15. Dezember 2009, 18:13
von Zap
Also wenn du alles (bis auf format()) befolgst was gesagt wurde geht's doch...

Code: Alles auswählen

In [23]: kennwort = "hallo"

In [24]: c = re.compile("((@.*){(%s),)" % re.escape(kennwort))

In [25]: c.match("@lalala{hallo,").groups()
Out[25]: ('@lalala{hallo,', '@lalala', 'hallo')
Edit: mit format geht's natürlich auch ;) Ich habe aber gerade nur Python25 im Angebot

Verfasst: Dienstag 15. Dezember 2009, 18:43
von Hyperion
Ach ich sehe grad, dass die geschweifte Klammer wohl kein Tippfehler war. Dann musst Du das bei .format() entsprechend escapen:

Code: Alles auswählen

In [2]: "((@.*){{({0}),)".format("welt")
Out[2]: '((@.*){(welt),)'