reg. Ausdruck; Satzbegrenzung

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.
rabby
User
Beiträge: 7
Registriert: Dienstag 13. Dezember 2005, 21:27
Kontaktdaten:

reg. Ausdruck; Satzbegrenzung

Beitragvon rabby » Mittwoch 21. Dezember 2005, 23:32

hallo welt!
momentan verwende ich:
'[Michael|Michaela] ist der Name für ([den|die]+ .*?)\. '
bei einem sinnlosen bsp text wie
"bla... Michaela ist der Name für die weibliche Person. Das Verwenden von Michael ist der Name für den Fehl-Treffer in diesem Fall mit der Nr.1, oder? bla. ..."

->"die weibliche Person" ist ein korrekter match
!->"den Fehl-Treffer in diesem Fall mit der Nr.1, oder?"... soll jedoch nicht herauskommen, da ein fragezeichen an stelle eines punktes als satzende/-zeichen auftritt,
(!-->und erst recht soll nicht "den Fehl-Treffer in diesem Fall mit der Nr", da nach dem Punkt ein Leerzeichen zu folgen hat, was mit dem genannten regexp bereits funktioniert)

wie berücksichtige ich matches, bei denen ein "?" einem punkt zuvorkommt? diese sollen nicht als treffer gezählt werden!
danke für vorschläge
joe

Re: reg. Ausdruck; Satzbegrenzung

Beitragvon joe » Donnerstag 22. Dezember 2005, 00:03

Hi!
rabby hat geschrieben:momentan verwende ich:
'[Michael|Michaela] ist der Name für ([den|die]+ .*?)\. '

Den rest habe ich nicht verstanden. Aber obigen regexp hättest du auch als
'[he|Milca] ist der Name für ([|iden]+.*?)\.'
schreiben können, was sicherlich nicht dein ziel war.
joe
joe

Re: reg. Ausdruck; Satzbegrenzung

Beitragvon joe » Donnerstag 22. Dezember 2005, 00:16

Jetzt habe ich es doch noch verstanden. Statt '.*?\.' versuche mal '[^?]*?\.' .
joe
BlackJack

Beitragvon BlackJack » Donnerstag 22. Dezember 2005, 00:25

Was joe damit sagen wollte ist, das ``[wort]`` eine Zeichenklasse ist und keine Zeichenkette. So eine Zeichenklasse erkennt genau eines der angegebenen Zeichen, wobei die Reihenfolge in der die Zeichen in den eckigen Klammern angegeben werden, völlig egal ist. Mein Beispiel kann man also auch so schreiben ``[rotw]`` und es wird immer noch das gleiche erkannt.

Also musst Du erstmal aus den eckigen, runde Klammern machen. Und als erstes am besten noch ``?:`` reinschreiben, dann wird das in den Klammern nicht als Gruppe aufbewahrt sondern nur erkannt.

Problem Nummer 2, das erkennen von Zeichen ausser einem, oder mehreren, bestimmten Zeichen löst man dann mit einer Zeichenklasse. Die kann man nämlich auch negieren in dem man als erstes ein '^' schreibt. Ein beliebiges Zeichen ausser dem Fragezeichen kann man also so erkennen: '[^?]'.

Code: Alles auswählen

In [29]: a = "bla... Michaela ist der Name für die weibliche Person. Das Verwenden von Michael ist der Name für den Fehl-Treffer in diesem Fall mit der Nr.1, oder? bla. ..."

In [30]: r = re.compile(r'(?:Michael|Michaela) ist der Name für ((?:den|die) [^?]*?)\. ')

In [31]: r.findall(a)
Out[31]: ['die weibliche Person']
toby

zusatzfrage

Beitragvon toby » Freitag 23. Dezember 2005, 19:03

hi,
hätte da ein ähnliches problem. der gesuchte string ist auch von zwei strings umschlossen. und folgt auf den anfangsstring das wörtchen "nicht", so soll der treffer/match nicht gezählt werden.
also "abc ist nicht das gesuchte." => []
"abc ist schon das gesuchte." => ['schon das gesuchte']
thx

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder