Seite 1 von 1
RegEx problem
Verfasst: Mittwoch 7. Dezember 2011, 05:00
von mit
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.
Re: RegEx problem
Verfasst: Mittwoch 7. Dezember 2011, 08:06
von 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'
Re: RegEx problem
Verfasst: Mittwoch 7. Dezember 2011, 08:33
von /me
BlackJack hat geschrieben:Das ist doch eigentlich ganz einfach:
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.
Re: RegEx problem
Verfasst: Mittwoch 7. Dezember 2011, 09:04
von /me
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:]])