Tengo un dato ruidoso … algo como
something something
Ahora solo quiero extraer "something something"
. ¿Hay alguna manera de cómo eliminar el texto entre esos dos delimitadores "<"
y ">"
?
Usa expresiones regulares :
>>> import re >>> s = '<@ """@$ FSDF >something something ' >>> re.sub('<[^>]+>', '', s) 'something something '
[Actualizar]
Si probó un patrón como <.+>
, Donde el punto significa cualquier carácter y el signo más significa uno o más, sabe que no funciona.
>>> re.sub(r'<.+>', s, '') ''
¡¿¡Por qué!?! Ocurre porque las expresiones regulares son “codiciosas” por defecto. La expresión coincidirá con cualquier cosa hasta el final de la cadena, incluida la >
, y esto no es lo que queremos. Queremos hacer coincidir <
y detener en el siguiente >
, así que usamos el patrón [^x]
que significa "cualquier carácter menos x" (siendo x >
).
El ?
El operador convierte el partido en "no codicioso", por lo que tiene el mismo efecto:
>>> re.sub(r'<.+?>', '', s) 'something something '
Lo anterior es más explícito, este es menos tipográfico; ten en cuenta que x?
significa cero o una aparición de x.
Por supuesto, puedes usar expresiones regulares.
import re s = #your string here t = re.sub('<.*?>', '', s)
El código anterior debería hacerlo.
Primero gracias Paulo Scardine, utilicé su trabajo para hacer una gran cosa. La idea era tener una etiqueta libre de LibreOffice po para imprimir. E hice el siguiente script que limpiará el archivo de ayuda para los más pequeños y más fáciles.
import re f = open('a.csv') text = f.read() f.close() clean = re.sub('<[^>]+>', ' ', text) f = open('b.csv', 'w') f.write(clean) f.close()
import re my_str = '<@ """@$ FSDF >something something ' re.sub('<.*?>', '', my_str) 'something something '
La función re.sub
toma una expresión regular y reemplaza todas las coincidencias en la cadena con el segundo parámetro. En este caso, estamos buscando todos los caracteres entre <
y >
( '<.*?>'
) Y reemplazándolos con nada ( ''
).
El ?
Se utiliza en re
para búsquedas no codiciosas.
Más sobre el módulo de re .
Si esos "ruidos" son realmente tags html, te sugiero que busques en BeautifulSoup
Solo por interés, podrías escribir algún código como:
with open('blah.txt','w') as f: f.write("""oneasfd twothree""") def filter_line(line): count=0 ignore=False result=[] for c in line: if c==">" and count==1: count=0 ignore=False if not ignore: result.append(c) if c=="<" and count==0: ignore=True count=1 return "".join(result) with open('blah.txt') as f: print "".join(map(filter_line,f.readlines())) >>> <>one<>asfd<> <>two<><>three<>