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:

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.

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:]])