Seite 1 von 1

regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 11:54
von blutigeranfaenger
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!

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 13:29
von noisefloor
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

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 14:37
von __blackjack__
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 😜

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 15:11
von __blackjack__
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"

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 15:48
von blutigeranfaenger
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?

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 16:19
von noisefloor
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

Re: regex: wie einen bestimmten String erstellen

Verfasst: Mittwoch 13. Dezember 2023, 17:04
von __blackjack__
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.