2011-03-04 12 views
5

Tengo una cadena que se ve así: "XaXbXcX". Estoy buscando hacer coincidir cualquier letra minúscula rodeada de X en cada lado. He intentado esto en Python, pero no voy a conseguir lo que estoy buscando:Regex: cómo hacer coincidir patrones superpuestos (quizás específicos de Python)

import re 
str = "XaXbXcX" 
pattern = r'X([a-z])X' 
matches = re.findall(pattern, str) # gives me ['a', 'c']. What about b? 
+0

En ese caso en particular, podría tener uso: re.split ('X', str). – dugres

+0

@dugres: en realidad, si la cadena se parecía a XaXbXcXddXeeeX, el patrón fallaría al devolver dd y eee (y una cadena vacía al principio y al final). –

Respuesta

7

Se puede utilizar una aserción hacia atrás:

pattern = r'(?<=X)([a-z])X' 
+0

I * believe * (pero podría convencerse de lo contrario) que lookbehind es una característica de Python 2.7, que no es criticar esta solución; si vas a ir con RegExes, es la única manera. – Malvolio

+1

Eso es incorrecto, las aserciones de búsqueda han estado disponibles desde Python 2.0. http://docs.python.org/release/2.0/lib/re-syntax.html – rmmh

0

No sé pitón, sin embargo, esto funciona de expresiones regulares También probé en gskinner ([^(?:X)+])+.

Espero que esto ayude

+0

el siguiente patrón también funciona ... '([^ X]) +' pruébalo también y avísame si ayuda . La expresión regular completa es: '/ ([^ (?: X) +]) +/gi' – Saravanan

+0

Sus patrones coinciden con todos los caracteres que" no son mayúsculas X ", lo cual es bastante diferente de" todos los caracteres en minúsculas rodeados por una X en cualquier lado". p.ej. si la secuencia que pasa es similar a esta XaXbbXcXdXeXfXggX, fallaría, ya que también coincidiría con los caracteres byg, a pesar de que no tienen X en * ambos lados. –

+0

como selecciono todos los caracteres que no sean X, pensé que podría usar todas las coincidencias. de todos modos b, g están todos rodeados de X. gracias por tu comentario – Saravanan

Cuestiones relacionadas