
Я пытаюсь найти полные формы аббревиатур, которые были указаны в тексте с помощью скобок.
Вот пример:
Аберрантное метилирование ДНК, одно из основных эпигенетических изменений при раке, как сообщается, накапливается в подтипе колоректального рака (КРР), так называемом фенотипе метилатора CpG-островка (CIMP), который, как известно, коррелирует с микросателлитной сниженной нестабильностью (MSI) - высоким КРР.
Здесь я хочу иметь возможность сформировать список сокращенных/полных форм вхождений, например:
КРР - колоректальный рак
CIMP - фенотип метилирующего островка CpG
MSI - микроспутник снизил нестабильность
Дело в том, что мне удалось найти все заключенные в скобки сущности, используя re.findall('(\(.*?\))', s)
, но найти соответствующую полную форму оказалось сложно.
Предполагая, что все такие полные формы находятся слева от скобок, я хочу использовать следующее2условия для фиксации полной формы аббревиатуры в скобках-
- количество слов не должно превышать 3+|SF|, где |SF| - количество символов в краткой форме (микроспутниковая пониженная нестабильность (MSI) - здесь полная форма имеет 4 слова, тогда как краткая форма имеет 3 символа)
- Первое слово полной формы начинается с первой буквы краткой формы (например,сколоректальный рак (сrc))
С моим текущим пониманием regex
я не смог написать уравнение, regex
которое решает два вышеуказанных условия и находит все такие случаи в тексте.
Не могли бы вы дать мне несколько советов по этому поводу?
решение1
Предполагая, что вы используете Python:
((\w)\w* )(\w* ){0,3}\((?i)(\2)[^)]*\)
Этот захватывает первый символ слова в группе 2. За этим словом следует от нуля до трех слов (увеличьте число, если подходит). Все слова разделяются буквенным пробелом. Далее следует открывающая скобка, за которой следует буква, захваченная в группе 2, которая становится нечувствительной к регистру. За всем этим следует остальная часть шаблона скобок.
Мне не удалось сопоставить количество слов с количеством символов аббревиатуры, поэтому одно из ваших условий не выполнено.
Мои комментарии были слишком пессимистичны. Но это выловит много глупостей.
Протестировано на regex101.com
Кстати, вы можете подправить шаблон скобок и использовать \([^)]*\)
. Отрицательные символы с жадным множителем не нуждаются в обратной ссылке, поэтому процесс работает быстрее.