
Ich versuche, die vollständige Form von Akronymen zu finden, die in einem Text in Klammern angegeben wurden.
Hier ist ein Beispiel:
Es wurde berichtet, dass sich eine abnorme DNA-Methylierung, eine der wichtigsten epigenetischen Veränderungen bei Krebs, bei einer Untergruppe von Dickdarmkrebs (CRC), dem sogenannten CpG-Insel-Methylator-Phänotyp (CIMP), ansammelt, von dem bekannt war, dass er mit einem CRC mit hoher Mikrosatelliten-Instabilität (MSI) korreliert.
Hier möchte ich in der Lage sein, eine Liste mit Vorkommen in Kurz-/Langform zu erstellen, wie:
CRC - Kolorektaler Krebs
CIMP - CpG-Insel-Methylator-Phänotyp
MSI - Mikrosatellit mit reduzierter Instabilität
Die Sache ist, dass ich alle in Klammern gesetzten Entitäten mithilfe von finden konnte re.findall('(\(.*?\))', s)
, es sich jedoch als schwierig erweist, die entsprechende Vollform zu finden.
Unter der Annahme, dass alle derartigen Vollformen auf der linken Seite der Klammer stehen, möchte ich Folgendes verwenden2Bedingungen, um die Vollform der Abkürzung in der Klammer zu erfassen.
- die Anzahl der Wörter darf nicht mehr als 3+|SF| betragen, wobei |SF| die Anzahl der Zeichen in der Kurzform ist (Micro Satellite Reduced Instability (MSI) - hier hat die Langform 4 Wörter, während die Kurzform 3 Zeichen hat)
- Das erste Wort der Langform beginnt mit dem ersten Buchstaben der Kurzform (z. B.CDarmkrebs (Crc))
Mit meinem derzeitigen Verständnis von regex
ist es mir nicht gelungen, ein zu schreiben, regex
das die beiden oben genannten Bedingungen löst und alle derartigen Fälle im Text findet.
Können Sie mir hierzu bitte einige Hinweise geben?
Antwort1
Angenommen, Sie verwenden Python:
((\w)\w* )(\w* ){0,3}\((?i)(\2)[^)]*\)
Dieses erfasst das erste Zeichen eines Wortes in Gruppe 2. Auf dieses Wort folgen null bis drei Wörter (erhöhen Sie die Zahl, falls geeignet). Alle Wörter werden durch ein Leerzeichen abgegrenzt. Als Nächstes folgt eine öffnende Klammer, gefolgt von dem in Gruppe 2 erfassten Buchstaben, wobei die Groß-/Kleinschreibung nicht beachtet wird. Darauf folgt der Rest des Klammermusters.
Ich konnte die Anzahl der Wörter nicht mit der Anzahl der Zeichen des Akronyms abgleichen, daher ist eine Ihrer Bedingungen nicht erfüllt.
Meine Kommentare waren zu pessimistisch. Aber es wird viel Unsinn aufdecken.
Getestet auf regex101.com
Übrigens könnten Sie das Klammermuster anpassen und verwenden \([^)]*\)
. Negierte Zeichen mit gierigem Multiplikator benötigen keine Rückreferenzierung, daher funktioniert der Vorgang schneller.