Encontre palavras com a mesma vogal separada por uma consoante

3

Estou procurando um argumento grep para encontrar em um texto palavras que tenham o padrão vogal-consoante-samevowel.

Exemplos:

oro
ene ro
f ofo
pppp epe pppp

Obrigado.

    
por allnex 23.09.2015 / 18:43

1 resposta

4

Observe que o que constitui uma vogal varia de acordo com o idioma e a região.

Para as vogais inglesas comumente admitidas (aqui considerando apenas as versões em minúsculas):

vowels=aeiou
consonants=bcdfghjklmnpqrstvwxyz

grep "\([$vowels]\)[$consonants]"

Você pode adaptar $vowels e $consonants ao seu idioma.

No entanto, com o Unicode, pode ficar um pouco mais complicado.

Por exemplo, mesmo se restringirmos à escrita latina, em francês, isso corresponderia à palavra para o verão: été. No Unicode, no entanto, é pode ser escrito como um caractere único (U + 00E9 é ) ou em uma forma decomposta com e seguido por seu acento agudo combinando ( ◌́ U + 0301 ).

Além disso, há caracteres como que são outra maneira de escrever 2 caracteres fi .

Uma maneira de resolver isso é converter o texto em um formulário normalizado , onde eles são expandidos para o multi -aractere forma antes de verificar (e, em seguida, precisamos considerar caracteres base e sua seqüência de diacríticos ou outros caracteres combinados (o cluster graphem completo como e⃞ ! = é̂ ).

perl -MUnicode::Normalize -C -lne '
  print if NFKD($_) =~ /((?=[aeiouy])\X)(?=[bcdfghjklmnpqrstvwxz])\X(?!\p{mark})/'

(NKFD é a forma de normalização com decomposição de compatibilidade , a que transforma é em e + ◌́ e em f + i ). / p>

\X in perl corresponde a um cluster graphem estendido . Então, (?=[aeiouy])\X é um cluster grafo cujo caractere base é uma vogal latina em minúscula (portanto, e ou é ...). Aqui, incluindo y como vogal (já que é considerado como tal em muitos idiomas usando o script latino).

Então, combinamos em um cluster de vogais seguido por um cluster consoante seguido pelo primeiro cluster como capturado em , mas precisamos garantir que o próximo caractere ainda não faça parte do cluster, caso contrário, ele corresponderia às coisas como eté . Daí o operador look-ahead negativo para verificar se o próximo caractere não é um com a propriedade mark .

Então, em uma entrada como:

fini
été
tacheté

Ele retorna:

fini
été
    
por 23.09.2015 / 18:53

Tags