Forum: PC-Programmierung RegEx Python


von Michael A. (michael_a43)


Lesenswert?

Hallo an alle Python-Programmierer,

ich würde gerne aus einem String mit Hilfe der re-Funktion in Python 
einzelne Teile extrahieren.

Hier der String:
00000010(00007273)

Ich würde gerne den Wert VOR der Klammer (hier: 00000010) und den Wert 
IN der Klammer (hier 7273) einzeln bekommen.

Meine Versuche mit:

 m = re.search(r"(.*)((.*))", data)

haben leider nicht geklappt.

Gruß,

Michi

von Michael A. (michael_a43)


Lesenswert?

Es kommt noch eine kl. Ergänung...

Der String ist doch etwas komplizierter als gedacht - es wurde nicht 
alles in der Konsole dargestellt.

Hier der passende String

('\x0200000010(00007336)\x03\x02',)


Aus diesem String will ich den Wert vor der Klammer ohne  dem "('\x02" 
(also 00000010) und den Wert in der Klammer (000007336) bekommen.

von Markus M. (mark_m)


Lesenswert?

Das http://www.regular-expressions.info/tutorial.html wird dir helfen. 
Es ist gar nicht so schwer.

Wenn Du es nicht selbst lernst musst Du bei jeder Anpassung wieder hier 
fragen.

Grüsse

von Salewski (Gast)


Lesenswert?

In Ruby etwa so:
1
/(?:\\x)(\d+)(?:\()(\d+)/.match('\x0200000010(00007336)\x03\x02').to_a[1,2]
2
=> ["0200000010", "00007336"]
In Python bin ich nicht so fit, wird wohl ähnlich sein, aber nicht so 
schön.

Die () im String wirst Du womöglich durch \ escapen müssen, ebenso das \ 
im String. Jedenfalls in Ruby.

Und übrigens:

>haben leider nicht geklappt.

ist eine schlechte Problembeschreibung.

von Michael A. (michael_a43)


Lesenswert?

Hallo,

vielen Dank für Eure Hilfe, uns ja, die Beschreibung war nicht ganz so 
gut.

Hier nochmal der zweite Anlauf.

Also der String sieht fast wie im ersten Posting aus- hier der richtige:
\x0200000010(00007552)\x03\x0e

(beim zweiten Posting hat schon das RegEx etwas zugeschlagen...)

Mein Python-RegEx sieht so aus:
m = re.search("(.*)(\d\d)\((.*)\)(.*)", data)

Mit "print m.groups()" bekomme ich auch das Array der Stringzerlegung 
nun angezeigt:
('\x02000000', '10', '00007552', '\x03\x06')
Ich habe also die beidne gesuchen Werte - nur noch nicht einzeln.

Wenn ich jetzt "print m.groups(2)" ausführe bekomme ich leider immer 
noch den gleichen String wie bei m.groups().

Wie kann ich mir jetzt die einzelnen Teile anzeigen lassen ?

von Michael A. (michael_a43)


Lesenswert?

Probem gelöst...

es muss m.group(x) und NICHT m.groups(x) heißen !!

Vielen Dank für die Nachtschwärmer, die mir auf die Spur geholfen haben.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Michael A. schrieb:
> es muss m.group(x) und NICHT m.groups(x) heißen !!

Noch ein kleiner Tipp: Falls du alle vier Gruppen in getrennten
Variablen weiterverarbeiten möchtest, ist es eleganter,
1
  var1, var2, var3, var4 = m.groups()

zu schreiben, anstatt jede Gruppe mit einem eigenen m.group(i)-Aufruf
aus dem Match zu extrahieren (var1 … var4 sind dabei natürlich durch
aussagekräftige Variablennamen zu ersetzten).

von Norbert (Gast)


Lesenswert?

1
#!/usr/bin/env python
2
# -*- coding: UTF-8 -*-
3
import re
4
data = '\x0200000010(00007552)\x03\x0e'
5
pattern = r'.(\d+)\((\d+)\).*'
6
m = re.search(pattern, data)
7
print m.group(1)
8
print m.group(2)
9
# 00000010
10
# 00007552

So vielleicht?

von Kodos (Gast)


Lesenswert?

Schön zum ausprobieren:
The Python Regular Expression Debugger - http://kodos.sourceforge.net/

von Michael S. (msb)


Lesenswert?

wie wäre es mit so etwas:

def SimpleExtraction(InStr):
    OutStr1, Sep, Temp  = InStr[1:].partition("(")
    OutStr2, Sep, Trash = Temp.partition(")")
    return OutStr1, OutStr2

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.