Regex: como verificar se há 13 letras em grego com um número ímpar de consoantes

3

Outro regex que eu não consigo quebrar :(

Eu tentei com egrep '([qwrtzpsdfghjklxcvbnmy]{1})|([qwrtzpsdfghjklxcvbnmy]{3})|([qwrtzpsdfghjklxcvbnmy]{5})|([qwrtzpsdfghjklxcvbnmy]{7})' greek.txt

No entanto, isso também retorna palavras com 4 consoantes, eu não entendo o porquê. Por que é que combina palavras com 4 vogais também?

Então este é meu greek.txt:

alpha
beta
gamma
delta
epsilon
zeta
eta
theta
iota
kappa
lambda
mu
nu
xi
omicron
pi
rho
sigma
tau
upsilon
phi
chi
psi
omega

Então alfa é ok (l p h = 3), beta não é (b t = 2), gama é ok (g m m = 3), delta é ok (d l t = 3), etc.

    
por Lucas Kauffman 08.08.2011 / 13:01

1 resposta

5

[abcde]{3} corresponde a três caracteres consecutivos no conjunto abcde . Então você está procurando por linhas contendo um, três, cinco ou sete caracteres consecutivos nesse conjunto, o que equivale a procurar por linhas com um desses caracteres.

Para procurar letras gregas, o primeiro passo é ter um padrão compatível com letras gregas, não com letras latinas. Para procurar linhas que contenham pelo menos 13 letras gregas, procure por 13 ocorrências do padrão “uma letra grega seguida por algumas outras coisas”. Aqui está um padrão que procura somente letras gregas sem letras minúsculas:

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}'

Se você quiser linhas que contenham exatamente 13 letras minúsculas gregas sem adornos (mais algumas outras coisas que não sejam luGl), filtre os resultados para eliminar linhas contendo 14 luGl.

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}' |
grep -v -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){14}'

Se você quiser linhas que contenham exatamente 13 luGl e nenhum outro caractere:

<greek.txt grep -x -E '[αβγδεζηθικλμνξοπρςστυφχψω]{13}'

Agora, se você quiser um número par de consoantes, procure linhas que consistam em “algo que não contenha nenhuma consoante seguida por um número par de (uma consoante seguida por algo que não contenha nenhuma consoante)”. Para um número ímpar, adicione outra ocorrência desse último subpadrão.

cons="βγδζθκλμνξπρςστφχψω"
<greek.txt grep -E "^[^$cons]*([$cons][^$cons]*[$cons][^$cons]*)*[$cons][^$cons]"

Em Perl, você pode combinar uma letra grega com o padrão \p{Greek} e uma letra minúscula em qualquer alfabeto com o padrão \p{Ll} . Para procurar uma letra grega minúscula, procure por (?=\p{Ll})\p{Greek} . Você deve executar seu script na semântica Unicode; A maneira mais fácil de fazer isso é executá-lo com a opção -C . () = m/REGEXP/g é uma expressão idiomática do Perl para contar o número de correspondências.

<greek.txt perl -C -l -ne 'print if (() = m/(?:(?=\p{Ll})\p{Greek})/g) == 13'

Não há uma maneira integrada de corresponder às vogais gregas, portanto, uma solução Perl para a segunda parte do seu problema terá que combiná-las explicitamente.

    
por 09.08.2011 / 01:50