Como encontrar a forma completa do acrônimo entre parênteses usando regex

2

Estou tentando encontrar formas completas de acrônimos que foram especificados em um texto usando parênteses.

Aqui está um exemplo:

Aberrant DNA methylation, one of the major epigenetic alterations in cancer, has been reported to accumulate in a subset of colorectal cancer (CRC), so-called CpG island methylator phenotype (CIMP), which was known to correlate with micro satellite reduced instability (MSI)-high CRC

Aqui, quero poder formar uma lista de ocorrências em formato curto / integral, como:

CRC - Colorectal Cancer

CIMP - CpG island methylator phenotype

MSI - micro satellite reduced instability

O fato é que consegui encontrar todas as entidades entre parênteses usando re.findall('(\(.*?\))', s) , mas encontrar o formulário completo correspondente está se mostrando difícil.

Supondo que todos os formulários completos estejam no lado esquerdo dos parênteses, eu quero usar as seguintes 2 condições para capturar a forma completa da abreviação nos 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 possui 3 caracteres)
  • A primeira palavra da forma completa começa com o primeiro caractere da forma abreviada (por exemplo, c câncer olorectal ( c rc))

Com meu entendimento atual de regex , não consegui escrever um regex que resolva as duas condições acima e encontre todos esses casos no texto.

Você poderia me dar algumas dicas para isso?

    
por user1993 17.10.2016 / 19:13

1 resposta

1

Supondo que você esteja usando o Python:

((\w)\w* )(\w* ){0,3}\((?i)()[^)]*\)

Este aqui captura o primeiro caractere de uma palavra no grupo 2. Esta palavra é seguida por zero a três palavras (aumente o número, se apropriado). Todas as palavras são delimitadas por um espaço literal. Em seguida, há um colchete aberto seguido pela letra capturada no grupo 2, o que não diferencia maiúsculas de minúsculas. Tudo isso é seguido o resto do padrão de suporte.

Não consegui corresponder o número de palavras com o número de caracteres do acrónimo, pelo que uma das suas condições não foi cumprida.

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 negativos com multiplicador ganancioso não precisam de referências anteriores, portanto, o processo funciona mais rápido.

    
por 20.11.2016 / 13:50

Tags