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!
regex: wie einen bestimmten String erstellen
- noisefloor
- User
- Beiträge: 3882
- 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:
Das funktioniert aber nicht mehr, wenn `fis` im Text vorkommt, weil das würde dann zu `eisis`.
Gruß, noisefloor
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'''>"
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 13242
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Aber es wurde doch explizit nach einem regulärem Ausdruck gefragt:
SCNR
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'''>"
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
- __blackjack__
- User
- Beiträge: 13242
- 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"
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
-
- User
- Beiträge: 65
- 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?
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?
- noisefloor
- User
- Beiträge: 3882
- 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
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
- __blackjack__
- User
- Beiträge: 13242
- 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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.