![Encontrando a forma completa do acrônimo entre parênteses usando regex](https://rvso.com/image/1510156/Encontrando%20a%20forma%20completa%20do%20acr%C3%B4nimo%20entre%20par%C3%AAnteses%20usando%20regex.png)
Estou tentando encontrar siglas completas que foram especificadas em um texto entre parênteses.
Aqui está um exemplo:
Foi relatado que a metilação aberrante do DNA, uma das principais alterações epigenéticas no câncer, se acumula em um subconjunto de câncer colorretal (CRC), chamado fenótipo metilador da ilha CpG (CIMP), que era conhecido por se correlacionar com a instabilidade reduzida de microssatélites ( MSI)-CRC alto
Aqui, quero poder formar uma lista de ocorrências de formato abreviado/completo, como:
CCR - Câncer Colorretal
CIMP - fenótipo metilador de ilha CpG
MSI - micro satélite reduziu a instabilidade
O problema é que consegui encontrar todas as entidades entre parênteses usando re.findall('(\(.*?\))', s)
, mas encontrar o formato completo correspondente está sendo difícil.
Supondo que todos esses formulários completos estejam no lado esquerdo dos parênteses, quero usar o seguinte2condições para capturar a forma completa da abreviatura entre parênteses-
- o número de palavras não deve ser superior a 3+|SF| onde |SF| é o número de caracteres na forma abreviada (instabilidade reduzida de micro satélite (MSI) - aqui a forma completa tem 4 palavras, enquanto a forma abreviada tem 3 caracteres)
- A primeira palavra da forma completa começa com o primeiro caractere da forma abreviada (por exemplo.ccâncer olorretal (crc))
Com meu entendimento atual de regex
, não consegui escrever um regex
que resolva as 2 condições acima e encontre todos esses casos no texto.
Você poderia me dar algumas dicas para isso?
Responder1
Supondo que você esteja usando Python:
((\w)\w* )(\w* ){0,3}\((?i)(\2)[^)]*\)
Este captura o primeiro caractere de uma palavra no grupo 2. Esta palavra é seguida por zero a três palavras (aumente o número se for adequado). Todas as palavras são delimitadas por um espaço literal. O próximo é um colchete aberto seguido pela letra capturada no grupo 2, que não faz distinção entre maiúsculas e minúsculas. Tudo isso é seguido pelo resto do padrão de colchetes.
Não consegui combinar o número de palavras com o número de caracteres da sigla, portanto uma de suas condições não foi atendida.
Meus comentários foram muito pessimistas. Mas vai pegar muita bobagem.
Testado em regex101.com
A propósito, você pode ajustar o padrão de colchetes e usar \([^)]*\)
. Caracteres negados com multiplicador ganancioso não precisam de referência retroativa, portanto o processo funciona mais rápido.