regex: wie einen bestimmten String erstellen

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
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
ich möchte eine bestimmte Auswahl von Strings als regex erstellen und wüsste gerne wie das geht.
Es geht im um den String "f", der durch "eis" ersetzt werden soll (enharmonische Verwechslung, ist was musikalisches).
Der Stringn könnte in folgenden Formen erscheinen:
f'4 f'' f,8 f,,32 <f a c'>4 <f'' a'' c'''>
Nach "f" kann also kommen: ein oder mehr Leerzeichen, eine oder mehrere Apostrophs oder Kommata, eine der folgende Ziffernkombination: 64,32,16,8,4,2,1 (evtl. noch gefolgt von einem Punkt) und auch ein Zeilenumbruch.
Wie kann ich all das erfassen?
Danke für eure Hilfe!
Benutzeravatar
noisefloor
User
Beiträge: 3866
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn alle f ersetzt werden sollen und sicher nur die Buchstaben a, b, c, d, e, f, g, h ersetzt werden sollen, dann brauchst du keine RegEx, das geht mit der `replace`Methode von Strings:

Code: Alles auswählen

>>> data = "f'4 f'' f,8 f,,32 <f a c'>4 <f'' a'' c'''>"
>>> data.replace('f', 'eis')
"eis'4 eis'' eis,8 eis,,32 <eis a c'>4 <eis'' a'' c'''>"
Das funktioniert aber nicht mehr, wenn `fis` im Text vorkommt, weil das würde dann zu `eisis`.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13160
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Aber es wurde doch explizit nach einem regulärem Ausdruck gefragt:

Code: Alles auswählen

In [21]: data = "f'4 f'' f,8 f,,32 <f a c'>4 <f'' a'' c'''>"

In [22]: import re

In [23]: re.sub("f", "eis", data)
Out[23]: "eis'4 eis'' eis,8 eis,,32 <eis a c'>4 <eis'' a'' c'''>"
SCNR 😜
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13160
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich habe die Testfälle mal um ein paar Nicht-Ersetzungskandidaten ergänzt und ein "f" am Ende um auch das am Ende zu testen:

Code: Alles auswählen

In [27]: data = "f'4 f'' f,8 f,,32 <f a c'>4 <f'' a'' c'''> Stuff fis f42 f,,23 f'3211 f"

In [28]: re.sub(r"\bf(('+|,+)?((64|32|16|8|4|2|1)(?=\D))?(?=$|[^\w',]))", r"eis\1", data)
Out[28]: "eis'4 eis'' eis,8 eis,,32 <eis a c'>4 <eis'' a'' c'''> Stuff fis f42 f,,23 f'3211 eis"
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Ja, super, der letzte Post macht genau das was ich will!
fis soll natürlich fis bleiben.
Jetzt hätte ich noch folgende Frage:
Wenn c zu his enharmonische verwechselt werden soll, dann würde z.B. aus c' his, aus c'' his', etc. (also immer ein Apostroph weniger).
Gäbe es da einen eleganten Weg, das umzusetzen?
Benutzeravatar
noisefloor
User
Beiträge: 3866
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du mehrere /viele Sachen ersetzen willst macht es IMHO irgendwann Sinn, sich einmal die Mühe zu machen, ein Dict anzulegen, wo alle Ersetzungen drin sind. Und dann mit Suchen & Ersetzen arbeiten.

Gibt es dafür keine fertige Software oder Python-Module, die das können? Musik bzw. Noten sind ja weder neu noch ein Nischenthema.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13160
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde sogar soweit gehen zu sagen das es irgendwann Sinn macht da einen ordentlichen Parser für zu schreiben, so dass man das am Ende alles verständlicher Ausdrücken kann als durch reguläre Ausdrücke und Textersetzung. Oder schauen ob es für Lilypond, denn danach sieht das ja aus, nicht bereits fertige Bibliotheken gibt.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten