Tratando de aprender Regex en Python para encontrar palabras que tengan combinaciones vocales-consonantes o consonantes-vocales consecutivas. ¿Cómo haría esto en regex? Si no se puede hacer en Regex, ¿hay una manera eficiente de hacerlo en Python?

9
Parseltongue 21 may. 2011 a las 10:17

3 respuestas

La mejor respuesta

Creo que deberías poder usar una expresión regular como esta:

r"([aeiou][bcdfghjklmnpqrstvwxz])+"

Para la vocal coincidente seguida de consonante y:

r"([bcdfghjklmnpqrstvwxz][aeiou])+"

Para consonante coincidente seguida de vocal. Como referencia, el + significa que coincidirá con la mayor repetición de este patrón que pueda encontrar. Por ejemplo, aplicar el primer patrón a "ababab" devolvería la cadena completa, en lugar de las ocurrencias únicas de "ab".

Si desea hacer coincidir una o más vocales seguidas de una o más consonantes, podría verse así:

r"([aeiou]+[bcdfghjklmnpqrstvwxz]+)+"

Espero que esto ayude.

11
Kevin Ward 21 may. 2011 a las 06:30

Si mapea los dígrafos consonánticos en consonantes simples, la palabra más larga es anatomicopatológica como una cadena de 10 * VC.

Si asigna correctamente y , obtendrá cadenas completas como acetilacetonatos como 8 * VC e hipocotiledonary como 8 * CV.

Si no necesita que la cadena esté completa, obtendrá un patrón de 9 * CV en quimio-mineralógico y un patrón de 9 * VC en sobreimaginación .

Hay muchas 10 * palabras si se permite alternar series de consonantes o vocales consecutivas, como en (C+V+)+. Estos incluyen laparocolpohysterotomy y ureterocystanastomosis .

El truco principal es primero mapear todas las consonantes a C y todas las vocales a V, luego hacer una coincidencia de VC o CV. Para Y, tienes que mirar hacia delante y / o mirar hacia atrás para determinar si se asigna a C o V en esa posición.

podría mostrarle los patrones que utilicé, pero probablemente no estará satisfecho conmigo. :) Por ejemplo:

 (?<= \p{IsVowel} )     [yY] (?= \p{IsVowel} )  # counts as a C
 (?<= \p{IsConsonant} ) [yY]                    # counts as a V
                        [yY] (?= \p{IsVowel} )  # counts as a C

El truco principal se convierte en buscar coincidencias superpuestas de alternancias de VC o CV a través de

 (?= ( (?:  \p{IsVowel}       \p{IsConsonant} )  )+ ) )

Y

 (?= ( (?:  \p{IsConsonant}   \p{IsVowel}     )  )+ ) )

Luego cuenta todos esos y ve cuáles son los más largos.

Sin embargo, dado que el soporte de Python no admite (de manera predeterminada / directa) las propiedades en expresiones regulares de la forma en que las utilicé para mi propio programa, esto hace que sea aún más importante procesar previamente la cadena en nada más que C 'sy V ' s. De lo contrario, tus patrones se ven realmente feos.

2
tchrist 21 may. 2011 a las 17:31
^(([aeiou][^aeiou])+|([^aeiou][aeiou])+)$

>>> import re
>>> consec_re = re.compile(r'^(([aeiou][^aeiou])+|([^aeiou][aeiou])+)$')
>>> consec_re.match('bale')
<_sre.SRE_Match object at 0x01DBD1D0>
>>> consec_re.match('bail')
>>>
3
Amber 21 may. 2011 a las 06:23