¿Cómo se usa una expresión regular en una lista de comprensión en Python?

Estoy tratando de ubicar todas las posiciones de índice de una cadena en una lista de palabras y quiero que los valores se devuelvan como una lista. Me gustaría encontrar la cadena si está sola, o si está precedida o seguida de puntuación, pero no si es una subcadena de una palabra más grande.

El siguiente código solo captura “vaca” solo y omite “prueba; vaca” y “vaca”.

myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] myString = 'cow' indices = [i for i, x in enumerate(myList) if x == myString] print indices >> 5 

He intentado cambiar el código para usar una expresión regular:

 import re myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] myString = 'cow' indices = [i for i, x in enumerate(myList) if x == re.match('\W*myString\W*', myList)] print indices 

Pero esto da un error: cadena esperada o búfer

Si alguien sabe lo que estoy haciendo mal, me encantaría escucharlo. Tengo la sensación de que tiene algo que ver con el hecho de que estoy tratando de usar una expresión regular cuando estoy esperando una cadena. ¿Hay alguna solución?

La salida que estoy buscando debería leer:

 >> [0, 4, 5] 

Gracias

No es necesario asignar el resultado de la match a x . Y tu partido debería estar en x lugar de en la list .

Además, debe usar re.search lugar de re.match , ya que su patrón de expresión regular '\W*myString\W*' no coincidirá con el primer elemento. Eso es porque test; no coincide con \W* . En realidad, solo necesita probar el siguiente carácter inmediato y el carácter anterior, y no la cadena completa.

Entonces, puedes usar word boundaries alrededor de la cadena:

 pattern = r'\b' + re.escape(myString) + r'\b' indices = [i for i, x in enumerate(myList) if re.search(pattern, x)] 

Hay algunos problemas con su código. Primero, debe hacer coincidir el expr con el elemento de la lista ( x ), no con la lista completa ( myList ). Segundo, para insertar una variable en la expresión, debe usar + (concatenación de cadenas). Y, finalmente, use literales brutos ( r'\W ) para interpetar correctamente las barras en el expr:

 import re myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow'] myString = 'cow' indices = [i for i, x in enumerate(myList) if re.match(r'\W*' + myString + r'\W*', x)] print indices 

Si hay posibilidades de que myString contenga caracteres especiales de expresión regular (como una barra o un punto), también deberá aplicarle re.escape :

 regex = r'\W*' + re.escape(myString) + r'\W*' indices = [i for i, x in enumerate(myList) if re.match(regex, x)] 

Como se señala en los comentarios, la siguiente podría ser una mejor opción:

 regex = r'\b' + re.escape(myString) + r'\b' indices = [i for i, x in enumerate(myList) if re.search(regex, x)]