Match String

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
Carlos123
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 21:36

Hallo zusammen,

Ich vereinfache die Aufgabe: ich habe den folgenden String:

Code: Alles auswählen

s = " aaa 8  objects with status 'o.k.'  hhhh"

ich versuche den Text "8 objects with statement 'o.k.'" zu matchen, mit Gruppen, weil ich danach die Zahl "8" haben möchte.
Es ist ein grosses Dokument mit ...statement 'not ok' und viele andere, deswegen möchte ich den ganzen Text matchen.

Ich habe's irgendwie hingekriegt, aber nicht gespeichert und jetzt komme ich nicht mehr drauf. Folgendes habe ich probiert:

Code: Alles auswählen

import re
reg = re.compile(r'(\d)+(\s)+("objects with status \'o.k.\'")')
mo = reg.search(s)
## zahl =mo.groups()[0]
allerdings ist mo = None.
was mache ich hier falsch

Danke im Voraus
Carlos
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Carlos123: Du suchst nach doppelten Anführungsstrichen die ich in dem Beispiel nicht entdecken kann. Und ein paar runde Klammern sind da auch zu viel/unnötig wenn Du nur die 8 haben möchtest.

Dein regulärer Ausdruck matched beispielsweise """aaa 8 "objects with status 'o.k.'" hhh""".
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Falls das Logs sind, die zeilenweise geschrieben wurden, wäre auch eine simple Lösung ohne RE möglich.
Carlos123
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 21:36

__blackjack__ hat geschrieben: Dienstag 11. Januar 2022, 01:01 @Carlos123: Du suchst nach doppelten Anführungsstrichen die ich in dem Beispiel nicht entdecken kann. Und ein paar runde Klammern sind da auch zu viel/unnötig wenn Du nur die 8 haben möchtest.

Dein regulärer Ausdruck matched beispielsweise """aaa 8 "objects with status 'o.k.'" hhh""".
Mit anderen Worten ich will das hier matchen:
8 objects with status 'o.k.'

Ich ein docx file in dem unter anderem folgendes gibt:
3 objects with status 'o.k.'
34 objects with status 'nok.'
11 objects with status 'na.'

und deswegen will den ganzen String matchen damit ich weiss, wieviele OKs , wieviele NOKs, wieviele NAs usw.
Carlos123
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 21:36

sparrow hat geschrieben: Dienstag 11. Januar 2022, 06:32 Falls das Logs sind, die zeilenweise geschrieben wurden, wäre auch eine simple Lösung ohne RE möglich.
Es ist ein docx file, da sind auch unter anderem folgende Zeilen:
3 objects with status 'o.k.'
34 objects with status 'nok.'
11 objects with status 'na.'

und da will ich rausfinden wieviel OKs, NOKs und NAs...
Carlos123
User
Beiträge: 9
Registriert: Montag 10. Januar 2022, 21:36

Ich hab's

Code: Alles auswählen

reg = re.compile(r'(\d)+(\s)+(objects with status \'o.k.\')')
Danke für den Hinweis __blackjack__
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Wenn du da schon eine Regular Expression drauf wirfst, warum dann nicht gleich für alle Fälle?

Ungetestet:

Code: Alles auswählen

import itertools
import re

text = """
3 objects with status 'o.k.'
34 objects with status 'nok.'
11 objects with status 'na.'
2 objects with status 'o.k.'
25 objects with status 'nok.'
99 objects with status 'na.'
"""

reg = re.compile(r"(\d+)\ +objects with status '(o.k.|nok.|na.)'")
matches = reg.findall(text)
keyfunc = lambda t: (t[1])
matches.sort(key=keyfunc)
status_to_sum = {
    status: sum(int(e[0]) for e in objects) for
    status, objects in itertools.groupby(matches, keyfunc)
}
print(status_to_sum)
Antworten