Tengo una gran lista de palabras que estoy tratando de limpiar. Varias de esas palabras aparecen varias veces escritas de manera un poco diferente cada vez y me gustaría normalizarlas. Por ejemplo, me gustaría reemplazar las siguientes palabras:

list = ["resident super", "super live in", "on site superintendent in building", "livein super", "residential super", "superintendent lives in", "on-site super"...]

Con solo superintendent

Pensé que podría hacer esto con

for item in list:
    re.sub("resident super|super live in|on site superintendent in building| livein super|residential super|superintendent lives in|on-site super", 
           "superintendent", list)

Pero estoy seguro de perder algunas entradas. Todas las entradas incluyen la palabra super, pero ¿hay alguna manera de tener una regla regex que reemplace todo el elemento con la palabra deseada?

0
Lukasz 16 feb. 2017 a las 01:08

4 respuestas

La mejor respuesta

El método re.sub no reemplaza una cadena en su lugar. No puede, ya que las cadenas en Python son inmutables. Cuando realiza una sustitución en una cadena, devuelve una nueva cadena con los cambios solicitados (o la cadena original si no hubo coincidencia). Actualmente ignora el valor de retorno, por lo que su código no tiene ningún efecto.

Pero no creo que realmente necesites expresiones regulares para este problema. Si desea reemplazar cualquier cadena que mencione la palabra super en cualquier lugar con la cadena "superintendent", puede usar una prueba de subcadena simple:

for i, item in enumerate(list_of_strings):
    if "super" in item:
        list_of_strings[i] = "superintendent"

Por supuesto, esto será más propenso a falsos positivos que usar su expresión regular actual. Aún puede usar la estructura del código anterior con una búsqueda de expresiones regulares si lo desea (simplemente cambie la línea if "super" in item: a if re.search(pattern, item): después de configurar pattern a una expresión regular que coincida con las cadenas que desea) a).

1
Blckknght 15 feb. 2017 a las 22:47

No estoy seguro si entiendo su pregunta, pero si desea reemplazar cada elemento con la palabra super por superintendant, esto es lo que haría.

for index,element in enumerate(listToCheck):
    if "super" in element:
        listToCheck[index]="superintendant"

Por cierto, no nombre sus variables list porque es una palabra clave reservada de Python.

1
staad 15 feb. 2017 a las 22:48

Más corto con una lista de comprensión:

lst = ["resident super", "super live in", "on site superintendent in building", 
"livein super", "residential super", "superintendent lives in", "on-site super", "mega-intendent"]

new_lst = ['superintendent' if 'super' in item else item 
            for item in lst]

print(new_lst)
# ['superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 
# 'superintendent', 'mega-intendent']
1
Jan 15 feb. 2017 a las 23:27

Podría estar malinterpretando su pregunta, pero ¿no podría usar in en su lugar? Esto no parece justificar la expresión regular, ya que la expresión regular es significativamente más lenta.

Por ejemplo:

i=0
while i < len(list):
    if 'super' in list[i]:
        list[i] = 'superintendant'
    i+=1

Esto reemplazará todo en su lista que contenga super con superintendent

1
Harsha Goli 15 feb. 2017 a las 22:49