Ergebnis 1 bis 6 von 6

Python und Regular Expressions

  1. #1 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Heyho,
    ich versuche gerade ein eigentlich einfaches Problem in Python3 zu lösen. Dazu benötige ich aus einem langen, mehrzeiligen String, diverse Abschnitte, die sich mitunter wiederholen.

    Da das eigentliche Problem für die Fehlersuche ein wenig zu komplex ist, hab ich es mal auf folgendes Beispiel herunter gebrochen:
    Code:
    import re #Lib für Regular Expressions
    sample = "abcabcabababcbabcabcccaba"
    re.findall('(abc)+', sample)
    > ['abc', 'abc', 'abc']
    re.findall('abc+', sample)
    > ['abc', 'abc', 'abc', 'abc', 'abccc']
    re.findall('(abc)', sample)
    > ['abc', 'abc', 'abc', 'abc', 'abc']
    Was ich eigentlich haben möchte ist:
    Code:
    > ['abcabc', 'abc', 'abcabc']
    Also die 3 rot hervorgehobenen Blöcke.

    Nach meiner Logik und dem, was ich so aus der Doku lese, müsste das mit dem ersten Beispiel funktionieren. Tja, oder auch nicht. Was mach ich falsch?
    Lookbehind ist offline

  2. #2 Zitieren
    Erzbaron Avatar von Mielas
    Registriert seit
    Nov 2003
    Ort
    █████████████████
    Beiträge
    12.227
    Das Problem ist, dass die group (also die Klammern) captured.
    Mit ?: kannst du eine non-capturing group draus machen:
    Code:
    print(re.findall('(?:abc)+', sample))
    Mielas ist offline

  3. #3 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Oh, ok. Ja, das funktioniert. Und sogar mit meinem eigentlichen Problem. Danke

    Aber dann hab ich das "Capturing" irgendwie falsch verstanden. Ich dachte, wenn das nicht capturing ist, dann wird der Part quasi ignoriert, und taucht im Ergebnis gar nicht auf. [Bild: gruebel.gif]
    Lookbehind ist offline

  4. #4 Zitieren
    Erzbaron Avatar von Mielas
    Registriert seit
    Nov 2003
    Ort
    █████████████████
    Beiträge
    12.227
    Zitat Zitat von Lookbehind Beitrag anzeigen
    Oh, ok. Ja, das funktioniert. Und sogar mit meinem eigentlichen Problem. Danke

    Aber dann hab ich das "Capturing" irgendwie falsch verstanden. Ich dachte, wenn das nicht capturing ist, dann wird der Part quasi ignoriert, und taucht im Ergebnis gar nicht auf. [Bild: gruebel.gif]
    ja is auch so. wenn du willst, dass der part weiter im ergebnis auftaucht müsstest du '((abc)+)' schreiben. dann hast du aber halt beides die nur (abc)'s und die +. deshalb das non-capturing
    Mielas ist offline

  5. #5 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Ahhhhh! Jetzt is der Groschen gefallen. Glaube ich.
    abcabc passt ja sowohl auf abc, abc, als auch auf abcabc, und bei Capturing wird quasi nur das abc, abc verwurstet, aber auch gleichzeitig noch dedupliziert. Wogegen bei Non-Capturing der Match so groß gemacht wird, wie es eben geht.

    Danke
    Lookbehind ist offline

  6. #6 Zitieren
    Mythos Avatar von Pyrokar
    Registriert seit
    May 2004
    Ort
    ..... hihihähähä hier gibt es Wände und wenn ich dagegen Lauf prall ich ab, wie ein Flummi..... hihihähähääähääääää
    Beiträge
    8.115
    So allgemein zu Regexen ist das hier mittlerweile meine zentrale Anlaufstelle geworden, der helle Wahnsinn.
    Zitat Zitat von Lookbehind Beitrag anzeigen
    Ahhhhh! Jetzt is der Groschen gefallen. Glaube ich.
    abcabc passt ja sowohl auf abc, abc, als auch auf abcabc, und bei Capturing wird quasi nur das abc, abc verwurstet, aber auch gleichzeitig noch dedupliziert. Wogegen bei Non-Capturing der Match so groß gemacht wird, wie es eben geht.
    Es gibt auch noch +?, das ist lazy und nimmt nur so wenig wie nötig um das quantifizierte Pattern zu matchen. Hier findest du alles zu Quantifiern.
    [Bild: gg_schuetzen_ani.gif] | ~ DauJones ~ | ~ Klopfers-Web ~ | ~ German Bash ~ |
    Die meisten und schlimmsten Übel, die der Mensch dem Menschen zugefügt hat, entsprangen dem felsenfesten Glauben an die Richtigkeit falscher Überzeugungen.
    Bertrand Russell
    Religionskriege sind Konflikte zwischen erwachsenen Menschen, bei denen es darum geht, wer den cooleren, imaginaeren Freund hat. anonym
    Pyrokar ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •