Index im String suchen

Guten Tag, jetzt zerbreche ich mir schon seit Tagen den Kopf ueber folgendes Problem: die Variabel a enthält folgenden String: a="Das ist <bo> foo </bo> das ist <bo> bar </bo> das ist nichts" Jetzt moechte ich gerne den jeden Start- und den Endindex der Zeichenkombination <bo> und <\bo> bekommen. Zwei von Unzaeligen versuchen sollen hier als Beispiel herangezogen werden: 1. x=re.match("\<bo\>",a) print x None 2. x=re.match("das",a) print x <_sre.SRE_Match object at 0x8645468> x.span(0) (0, 3) Zu 1. warum kann ich per RegEx die Zeichenkombination <bo> nicht finden, ich habe doch die Spitzenklammern per Backslash geschuetzt? Zu 2. Jetzt bekomm ich ein Match Objekt geliefert aber leider nur mit dem ersten Vorkommen von "das", mir ist mittlerweile klar geworden, dass Match nur nach dem ersten Vorkommen des Musters sucht. Gibt es noch eine Andere Moeglichkeit den Start- und Endindex aller Vorkommen geliefert zu bekommen? Bin fuer hinweise Dankbar mfg Albert _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

Hallo! Die Position bekommst du mit x = string.find(a, "<") print x MfG Steffen http://www.python-welt.de ----- Original Message ----- From: "Albert Hermeling" <Albert.Hermeling@t-online.de> To: <python-de@python.net> Sent: Sunday, February 02, 2003 1:50 PM Subject: [Python-de] Index im String suchen Guten Tag, jetzt zerbreche ich mir schon seit Tagen den Kopf ueber folgendes Problem: die Variabel a enthält folgenden String: a="Das ist <bo> foo </bo> das ist <bo> bar </bo> das ist nichts" Jetzt moechte ich gerne den jeden Start- und den Endindex der Zeichenkombination <bo> und <\bo> bekommen. Zwei von Unzaeligen versuchen sollen hier als Beispiel herangezogen werden: 1. x=re.match("\<bo\>",a) print x None 2. x=re.match("das",a) print x <_sre.SRE_Match object at 0x8645468> x.span(0) (0, 3) Zu 1. warum kann ich per RegEx die Zeichenkombination <bo> nicht finden, ich habe doch die Spitzenklammern per Backslash geschuetzt? Zu 2. Jetzt bekomm ich ein Match Objekt geliefert aber leider nur mit dem ersten Vorkommen von "das", mir ist mittlerweile klar geworden, dass Match nur nach dem ersten Vorkommen des Musters sucht. Gibt es noch eine Andere Moeglichkeit den Start- und Endindex aller Vorkommen geliefert zu bekommen? Bin fuer hinweise Dankbar mfg Albert _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

--On Sonntag, 2. Februar 2003 13:50 +0100 Albert Hermeling <Albert.Hermeling@t-online.de> wrote:
Zu 1. warum kann ich per RegEx die Zeichenkombination <bo> nicht finden, ich habe doch die Spitzenklammern per Backslash geschuetzt?
Doku lesen: """ Note that match may differ from search using a regular expression beginning with "^": "^" matches only at the start of the string, or in MULTILINE mode also immediately following a newline. The ``match'' operation succeeds only if the pattern matches at the start of the string regardless of mode, or at the starting position given by the optional pos argument regardless of whether a newline precedes it. """ Im Klartext: Nimm re.search() anstatt re.match() -aj _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

On Sun, 02 Feb 2003 14:16:56 +0100, Andreas Jung wrote:
Im Klartext: Nimm re.search() anstatt re.match()
Was er tatsächlich möchte ist re.findall. Steht auch inner Doku. ;> Ciao, Jürgen _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

Am Sonntag, 2. Februar 2003 17:44 schrieb Juergen Hermann:
On Sun, 02 Feb 2003 14:16:56 +0100, Andreas Jung wrote:
Guten Abend,
Im Klartext: Nimm re.search() anstatt re.match() Was er tatsächlich möchte ist re.findall. Steht auch inner Doku. ;>
Was ich tatsaechlich gebrauche ist eine Moeglichkeit alle!! vorkommen von <bo> in einem Text zu finden und nur den Start- und Endindex zu bekommen. Die Methode re.search("<bo>", a) liefert mir zwar ein Match Obkekt aber nur mit den Indexen des Ersten Treffers. Die Methode re.findall("<bo",a) liefert mir alle <bo> in einer Liste was ich gar nicht gebrauchen kann. mfg Albert Hermeling _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
Am Sonntag, 2. Februar 2003 17:44 schrieb Juergen Hermann:
On Sun, 02 Feb 2003 14:16:56 +0100, Andreas Jung wrote:
Guten Abend,
Im Klartext: Nimm re.search() anstatt re.match() Was er tatsächlich möchte ist re.findall. Steht auch inner Doku. ;>
Was ich tatsaechlich gebrauche ist eine Moeglichkeit alle!! vorkommen von <bo> in einem Text zu finden und nur den Start- und Endindex zu bekommen.
Dafuer gibt es keine extra Funktion. Du wirst re.search() mehrmals aufrufen muessen, jeweils auf den Rest des Strings hinter dem vorherigen match (ungetestet): def findranges(s, p): cp = re.compile(p) m = cp.search(s) posl: [] rest = 0 while m != None: posl.append((m.start, m.end)) rest = rest + m.end m = cp.search(s[rest:]) return posl -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

On Sun, 2 Feb 2003 18:18:43 +0100, Albert Hermeling wrote:
Die Methode re.search("<bo>", a) liefert mir zwar ein Match Obkekt aber nur mit den Indexen des Ersten Treffers.
Die Methode re.findall("<bo",a) liefert mir alle <bo> in einer Liste was ich gar nicht gebrauchen kann.
Dann nimm das:
bo = re.compile(r"(</?bo>)") bo.split("bleh <bo> blah </bo> bar") ['bleh ', '<bo>', ' blah ', '</bo>', ' bar']
Ciao, Jürgen _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

Hallo Albert, für Dein Problem wirst Du wohl eine Funktion brauchen, mit den regexpr-Funktionen von Python wird das wohl nicht gehen. def findall(s, sub): erg = [] i = 0 while i < len(s): f = find(s, sub, i) if f < 0: break erg.append(f) i = f+1 return erg
a = "Das ist <bo> foo </bo> das ist <bo> bar </bo> das ist nichts" findall(a, "<bo>") [8, 31] findall(a, "</bo>") [17, 40]
damit bekommst Du alle Indices von "<bo>" und "</bo>" geliefert und kannst damit machen was Du willst. Gruß Dookie _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de

Am Sun, 2 Feb 2003 19:17:48 +0100 Schrieb Fritz Cizmarov <fritz@sol.at>:
... from string import find
def findall(s, sub): erg = [] i = 0 while i < len(s): f = find(s, sub, i) if f < 0: break erg.append(f) i = f+1 return erg
das find stammt natürlicha aus dem Modul string. Wenn Du aber nur die Strings zwischen "<bo>" und "</bo>" brauchst, kannst Du schon mit re.findall arbeiten
re.findall("\<bo\>\s*([^\s<]*)\s*\</bo\>",a) ['foo', 'bar']
Gruß Dookie _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
participants (6)
-
Albert.Hermeling@t-online.de
-
Andreas Jung
-
Fritz Cizmarov
-
Georg Mischler
-
Juergen Hermann
-
python-welt.de