Estoy trabajando en Python 2.7. Quiero eliminar los caracteres no alfabéticos de cada lista en una lista de listas sin modificar la estructura de las listas.

Ejemplo de lista inicial de listas:

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]
print (csvarticles[0])

Salida deseada:

[['betabloqueantes', 'magia', '1980', 'presse medicale'], ['hipertensión en la mujer embarazada', '', '2010', 'médico'], ['hipertensión arterial', '' , '1920', 'la nouvelle']]

Código 1:

csvarticles = [[word.lower().split() for word in nodeList] for nodeList in csvarticles]

print (csvarticles[0])

Código 1 Salida:

['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'] [['[beta-blockers]'], ['magic!'], ['1980'], ['presse ',' medicale ']]

Código 2:

csvarticles = [[word.lower().split() for word in nodeList if word.isalpha()] for nodeList in csvarticles]

Código 2 de salida:

[]

Código 3:

articleTitle = []
for x, y in enumerate(csvarticles):
    myString = simpleWords(csvarticles[x][0])
    if myString is not '':
        myString = myString.lower()
        myString = re.sub('[\W_]+', ' ', myString, flags=re.UNICODE)
        myList = [word for word in myString.split() if len(word) > 3]
        articleTitle = ' '.join(myList)

Código 3 de salida:

['betabloqueantes', 'magia', '1980', 'presse medicale', 'mujer embarazada con hipertensión', '2010', 'médico', 'hipertensión arterial', '1920', 'nouvelle']

El código 3 se acerca pero elimina la estructura de las listas anidadas.

-1
Tiffany F. 28 feb. 2018 a las 19:27

3 respuestas

La mejor respuesta

Desea reemplazar caracteres no alfanuméricos o alfanuméricos y recortar / poner en minúscula la cadena. Regex es bastante eficiente para esos reemplazos, encadenados con str.strip.

Reconstruir las listas anidadas en una compilación de lista doble:

import re

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]

result = [[re.sub("[^ \w]"," ",x).strip().lower() for x in y] for y in csvarticles]

print(result)

Huellas:

[['beta blockers', 'magic', '1980', 'presse medicale'], ['hypertension in the pregnant woman', '', '2010', 'medical'], ['arterial hypertension', '', '1920', 'la nouvelle']]

Si está utilizando Python, reemplace lower por casefold para manejar caracteres locales especiales

3
Jean-François Fabre 1 mar. 2018 a las 14:04

Si quieres hacer esto de una sola línea:

ENTRADA:

output = [[k.lower() for k in [' '.join(re.findall(r'[^\]\[.!-][A-z0-9]+[^\]\[.!-]', j)) for j in i]] for i in csvarticles]

Salida:

[['beta blockers', 'magic', '1980', 'presse  medicale'], ['hypertension  in  the  pregnant  woman', '', '2010', 'medical'], ['arterial  hypertension', '', '1920', 'la  nouvelle']]

REGEX:

[^\]\[.!-][A-z0-9]+[^\]\[.!-]
1
rahlf23 28 feb. 2018 a las 16:40

Use el método string.isalnum () para verificar si la cadena es alfabeto o número.

Demostración

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]
res = []
for i in csvarticles:
    r = []
    for j in i:
        r.append("".join([k for k in j if (k.isalnum() or k.isspace())]).lower())
    res.append(r)
print(res)

Salida :

[['betablockers', 'magic', '1980', 'presse medicale'], ['hypertension in the pregnant woman', '', '2010', 'medical'], ['arterial hypertension', '', '1920', 'la nouvelle']]
1
Rakesh 1 mar. 2018 a las 11:45