RegEx problem

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
ich habe den String 'a' und moechte aus den eckigen Klammern nur den ersten Buchstaben uebernehmen um den folgenden String 'b' zu erhalten:
a = 'XXxxXXxXSSAA[C/G]Rwdefffghh' # Eingabe
b = 'XXxxXXxXSSAACRwdefffghh' # Ausbage

Wie koennte man dieses Problem loesen?

Vielen Dank im Vorraus.
BlackJack

Das ist doch eigentlich ganz einfach:

Code: Alles auswählen

In [485]: a
Out[485]: 'XXxxXXxXSSAA[C/G]Rwdefffghh'

In [486]: re.sub(r'\[(.)/.\]', r'\1', a)
Out[486]: 'XXxxXXxXSSAACRwdefffghh'
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Das ist doch eigentlich ganz einfach:

Code: Alles auswählen

re.sub(r'\[(.)/.\]', r'\1', a)
Regular Expressions erschlagen Anfänger immer so schnell. :-) Das ist jetzt ein relativ einfacher Ausdruck, den wir zur Erklärung mal aufdröseln. Man beachte das r vor dem String. Dadurch wird der String als raw gekennzeichnet, was wiederum bedeutet, dass der Backslash seine Rolle als Escape-Zeichen in Python verliert. Ohne das r müsste jeder Backslash verdoppelt werden damit einer noch bei der Regex-Engine ankommt. Jetzt aber zum Ausdruck selber:
  • \[ - eine öffnende eckige Klammer (Der Backslash ist nötig, da eine einzelne eckige öffnende Klammer als Beginn eines Sets von Zeichen gesehen würde)
  • ( - Definiert den Beginn einer Gruppe
  • . - ein beliebiges Zeichen
  • ) - das Ende der zuletzt geöffneten Gruppe
  • . - ein beliebiges Zeichen
  • \] - eine schließende eckige Klammer
Dieser komplette Block wird jetzt ersetzt. Dafür nehmen wir keinen konstanten Wert, sondern das Zeichen, das wir in der ersten - mit den runden Klammern definierten - Gruppe gefunden haben. Referenziert wird das durch das \1. Eine theoretisch zu verarbeitende zweite Gruppe wäre über \2 zu erreichen usw.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mit hat geschrieben:Wie koennte man dieses Problem loesen?
Wenn du die Flexibilität von regulären Ausdrücken nicht benötigst, dann könntest du auch klassisch und schneller arbeiten.

Code: Alles auswählen

a = 'XXxxXXxXSSAA[C/G]Rwdefffghh'
data = a.split('[')
result = ''.join([data[0], data[1][0], data[1][4:]])
Antworten