Regex (Alles von Postion Sechs bis Ende matchen)

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
Steven2002
User
Beiträge: 4
Registriert: Samstag 28. Januar 2023, 19:40

Hallo,
ich habe einen String, der 10 Zeichen oder länger sein kann. Die ersten 10 Zeichen kann ich bereits erfolgreich gruppieren, da es keine Überschneidungen gibt.
Allerdings möchte ich eine weitere Match-Gruppe erhalten, die alle Zeichen von Postion Sechs bis String Ende zurückgibt.

Beispiel für Strings:

45fd15sfdsfgf (13 Zeichen)
5515gaag13s3g3fgs (17 Zeichen)

Mein bisheriger Regex kann die ersten 10 Zeichen in 3 Gruppen einteilen (1.Gruppe: ersten zwei Zeichen, 2 Gruppe: Zeichen drei und vier, 3.Gruppe: Zeichen fünf bis sechs)
r^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{6})

Nun fehlt mir noch eine 4.Gruppe, die mir alle Zeichen von Postion sechs bis Stringende zurückgibt).
Also beim ersten String wäre das 5sfdsfgf und beim zweiten aag13s3g3fgs

Ich denke das müsste mit dem Zusatz, der ähnlich diesem ist funktionieren: r^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{6})(?<=([0-9a-fA-F])
Allerdings habe ich es nicht geschafft, es so zu modifizieren, um an mein gewünschtes Ergebnis zu kommen.

LG,
Steven
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Steven2002: Also ich denke ja reguläre Ausdrücke sind da nicht das richtige Werkzeug.

Code: Alles auswählen

In [58]: text = "45fd15sfdsfgf"

In [59]: text[:2], text[2:4], text[4:6], text[6:]
Out[59]: ('45', 'fd', '15', 'sfdsfgf')
Edit: Wie kommst Du darauf das beim ersten Beispiel das letzte Element mit der 5 anfangen sollte?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Steven2002
User
Beiträge: 4
Registriert: Samstag 28. Januar 2023, 19:40

@__blackjack__, weil die 5 das sechste Zeichen ist.
Ich muss es leider mit Regex lösen. Trotzdem danke.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Steven2002: Ah, okay, ich habe das „überschneiden“ übersehen. Das ist noch ein Grund mehr der gegen reguläre Ausdrücke spricht. Wahrscheinlich sogar ein harter Grund, im Sinne von das wird zumindest mit normalen Mitteln nicht gehen das gleiche Zeichen in überschneidenden Gruppen zu haben.

Code: Alles auswählen

In [60]: text[:2], text[2:4], text[4:6], text[5:]
Out[60]: ('45', 'fd', '15', '5sfdsfgf')
Warum muss es ein (ir)regulärer Ausdruck sein?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

muß das alles in einen einzigen regulären Ausdruck gekippt werden oder dürfen es auch z.B. zwei sein? Der zweite Ausdruck würde sich dann nur um den Teil "sechs bis Ende" kümmern?
Steven2002
User
Beiträge: 4
Registriert: Samstag 28. Januar 2023, 19:40

@grubenfox Ja alles in einem r^ Ausdruck. Genau der letzte Teil soll alle Zeichen von sechs bis String Ende in einer Gruppe zurückgeben. Und ich denke es muss irgendwie mit Lookbehind "?<=" funktionieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Steven2002: Ein „lookbehind“ konsumiert keine Zeichen, der testet nur. Alles was der matcht landet *nicht* in einer Gruppe:

Code: Alles auswählen

In [70]: re.findall(r"(..)((?<=.).)", "abc")
Out[70]: [('ab', 'c')]
Selbst wenn man das "b" explizit angibt, dann sieht man, dass der das zwar matcht, aber es nicht Teil der zweiten Gruppe ist/wird:

Code: Alles auswählen

In [71]: re.findall(r"(..)((?<=b).)", "abc")
Out[71]: [('ab', 'c')]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Steven2002
User
Beiträge: 4
Registriert: Samstag 28. Januar 2023, 19:40

Vielleicht habe ich mich auch schlecht ausgedrückt. Inzwsichen bin ich soweit:

Code: Alles auswählen

r'^([0-9a-zA-Z]{2})([0-9a-zA-Z]{2})([0-9a-zA-Z]{6})(?<=([0-9a-zA-Z]{6}))'
Wenn du auf regex101 diesen Ausdruck nimmst, siehst du, dass der lookbehind auch in eine Gruppe kommt: gaag13
Allerdings will ich, dass gaag13s3g3fgs zurückkommt in der letzten Gruppe.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Tja und das geht halt nicht. In diesem Fall konkret weil der Look-Behind eine feste Länge haben muss. Vielleicht drücke ich mich auch zu vorsichtig aus, aber ich bin ziemlich fest davon überzeugt, dass das nicht geht was Du willst.

Vielleicht noch mal die bisher unbeantwortete Frage warum das unbedingt ein regulärer Ausdruck sein muss‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Wenn man bei Null zu zählen anfängt, scheint das alles irgendwie sinnvoller zu sein. Dann hat man die Zeichen an den den Indizes 0/1, 2/3, 4/5 und dann ab einschließlich dem Index 6 bis zum Ende. Man müsste halt die genaue (Haus-)Aufgabenstellung kennen.
In specifications, Murphy's Law supersedes Ohm's.
Antworten