Texto limpiar en Python
-
21-12-2019 - |
Pregunta
Soy nuevo en Python y no puede encontrar una manera de eliminar el inútil de texto.El propósito principal es mantener la palabra que quiero y eliminar el resto.En esta etapa, puedo comprobar mi in_data y encontrar la palabra que yo quiero.Si frase.encontrar(wordToCheck) es positivo, luego la guardo.El in_data es la frase que cada fila, pero la corriente de salida es una palabra de cada línea.Lo que quiero es permanecer en los formatos, buscar la palabra en cada fila y eliminar el resto.
import Orange
import orange
word = ['roaming','overseas','samsung']
out_data = []
for i in range(len(in_data)):
for j in range(len(word)):
sentence = str(in_data[i][0])
wordToCheck = word[j]
if(sentence.find(wordToCheck) >= 0):
print wordToCheck
salida
roaming
overseas
roaming
overseas
roaming
overseas
samsung
samsung
El in_data es frase como
contacted vodafone about going overseas and asked about roaming charges. The customer support officer says there isn't a charge but while checking my usage overseas.
Puedo esperar a ver la salida es como
overseas roaming overseas
Solución
Puede usar REGEX para esto:
>>> import re
>>> word = ['roaming','overseas','samsung']
>>> s = "Contacted vodafone about going overseas and asked about roaming charges. The customer support officer says there isn't a charge but while checking my usage overseas."
>>> pattern = r'|'.join(map(re.escape, word))
>>> re.findall(pattern, s)
['overseas', 'roaming', 'overseas']
>>> ' '.join(_)
'overseas roaming overseas'
El enfoque no regeo sería usar str.join
con str.strip
y una expresión del generador.Se requiere la llamada de la tira () para deshacerse de las puntuaciones como '.'
, ','
, etc.
>>> from string import punctuation
>>> ' '.join(y for y in (x.strip(punctuation) for x in s.split()) if y in word)
'overseas roaming overseas'
Otros consejos
Aquí hay una forma más sencilla:
>>> import re
>>> i
"Contacted vodafone about going overseas and asked about roaming charges. The customer support officer says there isn't a charge but while checking my usage overseas."
>>> words
['roaming', 'overseas', 'samsung']
>>> [w for w in re.findall(r"[\w']+", i) if w in words]
['overseas', 'roaming', 'overseas']
Usted puede hacer que sea mucho más sencillo, como este:
for w in in_data.split():
if w in word:
print w
Aquí tenemos la primera división el in_data
por espacios, que devuelve una lista de palabras.Tenemos entonces el bucle a través de cada palabra en los datos y comprobar si la palabra es igual a uno de los que está buscando.Si lo hace, entonces le imprima.
Y, aún más rápido de búsqueda, hacer el word
-lista de un conjunto en su lugar.Mucho más rápido.
Además, si desea manejar puntuaciones y símbolos que usted necesita para usar regex o comprobar si todos los caracteres de la cadena es una carta.Así, para obtener el resultado que usted desea:
import string
in_words = ('roaming','overseas','samsung')
out_words = []
for w in in_data.split():
w = "".join([c for c in w if c in string.letters])
if w in in_words:
out_words.append(w)
" ".join(out_words)
Una respuesta con Split se caerá en la puntuación.Necesitas romper las palabras con una expresión regular.
import re
in_data = "contacted vodafone about going overseas and asked about roaming charges. The customer support officer says there isn't a charge but while checking my usage overseas."
word = ['roaming','overseas','samsung']
out_data = []
word_re = re.compile(r'[^\w\']+')
for check_word in word_re.split(in_data):
if check_word in word:
print check_word