Variablen Problem im Suchmuster

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
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du bekomsmt None zurück wenn die re nicht zutrifft.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Stichwort String Formatierung :-)

Die Frage ist natürlich inwiefern dann das compile überhaupt sinnvoll ist...
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Code: Alles auswählen

ersetzwort= re.compile("((@.*){(%s))" % kennwort)  
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Immer an die Zukunft denken ;-)

Code: Alles auswählen

ersetzwort= re.compile("((@.*)(({0}))".format(kennwort))
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

hmm das mit der zukunft musst du mir newbie erklären^^ aber danke für den tip, hat geholfen:-)

lg
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... wenn Du nochmal sagen kannst "wo" das steht, klar gerne warum nicht.
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

@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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Masaru hat geschrieben:... wenn Du nochmal sagen kannst "wo" das steht, klar gerne warum nicht.
Nirgends - nehme ich mal an :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
orangenbaum
User
Beiträge: 6
Registriert: Montag 14. Dezember 2009, 13:11

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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),)'
Antworten