2009-06-21 20 views
7

Pregunta:
¿Es posible, con expresiones regulares, hacer coincidir una palabra que contiene el mismo carácter en diferentes posiciones?¿Es posible combinar una repetición de caracteres con expresiones regulares? ¿Cómo?

Estado:
Todas las palabras tienen la misma longitud, ya sabes las posiciones de caracteres (ejemplo los días 1, el 2 y el 4) del carbón repetida, pero usted no sabe lo que es.

Ejemplos:
el uso de palabras 6char minúsculas que me gustaría pasar de las palabras en la 3ª y la 4ª caracteres son los mismos.

parrot <- match for double r 
follia <- match for double l 
carrot <- match for double r 
mattia <- match for double t 
rettoo <- match for double t 
melone <- doesn't match 

no puedo usar el cuantificador [\ d] {2}, ya que coincide con ninguna sucesión de dos caracteres, y lo que si digo que la segunda y la cuarta posición en lugar de 3 y 4?

¿Es posible hacer lo que quiero con expresiones regulares? Si es así, ¿cómo puedo hacer eso?

EDIT:
preguntar preguntando en los comentarios, estoy usando Python

+2

Los motores de expresiones regulares pueden diferir mucho entre idiomas y herramientas. Por lo tanto, siempre debe decir con qué lenguaje o herramienta está trabajando (Perl? Python? Grep? C y una biblioteca?) – Telemachus

+0

hecho! ¡Gracias! (15char) –

+0

¿Es esta tarea? –

Respuesta

26

Se puede utilizar una referencia hacia atrás para hacer esto:

(.)\1 

Esto corresponderá con las ocurrencias de cualquier carácter.


Editar He aquí algunos ejemplos de Python:

import re 

regexp = re.compile(r"(.)\1") 
data = ["parrot","follia","carrot","mattia","rettoo","melone"] 

for str in data: 
    match = re.search(regexp, str) 
    if match: 
     print str, "<- match for double", match.group(1) 
    else: 
     print str, "<- doesn't match" 
+1

la alternativa a esto es (aa | bb | cc | ..zz | AA | BB | lol) – dfa

+0

Bastante tarde, pero como referencia, cabe señalar que esta expresión regular en realidad coincide con la primera repetición del personaje (re.search (r "(.) \ 1", "parrrrrot"). group (0) produce 'rr'). Para hacer coincidir todas las ocurrencias (y poder extraer el grupo que se repite) es posible que desee utilizar: re.search (r "((.) \ 2+)", "parrrrot"). Group (1) (que produce el correcto answer 'rrrr') – Rick77

2

/(\b\w*?(\w)\2.*?\b)/

coincidirá con cualquier palabra con al menos el carácter de repetición $ 1 que es la palabra $ 2, la primera repetición.

7

Necesita utilizar referencias para estos casos. No estoy seguro de qué idioma está usando, probé el siguiente ejemplo en mi editor VI para buscar cualquier alfabeto que se repita. patrón de expresión:\([a-z]\)\1

Si ve el ejemplo, [a-z] es el patrón que está buscando, y encierran un paréntesis que dentro del (los parantheses deben escaparon en algunos idiomas). Una vez que tienes una parátesis, es un grupo y puedes volver a referirte a cualquier parte de la expresión regular usando \ 1. Si hay más de un grupo, puede usar \ 1, \ 2 etc. \ 1 será reemplazado por lo que haya coincidido en el primer grupo.

Gracias Arvind

0

Sí, puede utilizar constructo referencia hacia atrás para que coincida con las letras dobles.

La expresión regular (?<char>\w)\k<char>, utilizando grupos nombrados y referencias posteriores, busca los caracteres emparejados adyacentes. Cuando se aplica a la cadena "Tomaré un café pequeño", encuentra coincidencias en las palabras "I'll", "small" y "coffee".El metacarácter \w encuentra cualquier carácter de palabra única. La construcción de agrupamiento (?<char>) incluye el metacarácter para forzar al motor de expresiones regulares a recordar una coincidencia de subexpresión (que, en este caso, será un solo carácter) y guardarla con el nombre "char". La construcción de referencia inversa \k<char> hace que el motor compare el carácter actual con el carácter previamente coincidente almacenado en "char". Toda la expresión regular encuentra con éxito una coincidencia cuando un solo carácter es el mismo que el anterior.

+0

Siempre debe utilizar palos de retroceso o bloques de código para formatear cualquier código fuente que incluya en sus publicaciones. Esta respuesta no tenía ningún sentido hasta que agregué backticks alrededor de tus expresiones regulares. –

+0

Vaya! ¡Mi error! Gracias Alan :) –

Cuestiones relacionadas