2010-09-07 12 views
11

Necesito eliminar las etiquetas de una cadena en python.¿Cómo eliminar las etiquetas de una cadena en python usando expresiones regulares? (NO en HTML)

<FNT name="Century Schoolbook" size="22">Title</FNT> 

¿Cuál es la forma más eficaz para eliminar toda la etiqueta en ambos extremos, dejando sólo "Título"? Solo he visto formas de hacerlo con etiquetas HTML, y eso no me ha funcionado en Python. Estoy usando esto particularmente para ArcMap, un programa GIS. Tiene sus propias etiquetas para sus elementos de diseño, y solo necesito eliminar las etiquetas para dos elementos de texto de título específicos. Creo que las expresiones regulares deberían funcionar bien para esto, pero estoy abierto a cualquier otra sugerencia.

+0

qué quiere Título sea Título cuando se hace, o Título o <> Título <> o? , ¿no está seguro de su pregunta lo que está buscando? – Doon

+0

Entonces, ¿cómo debe verse esta cadena después del procesamiento? No estoy del todo claro sobre lo que quieres hacer. –

+2

Lo siento. La cadena debe ser "Título" después del procesamiento. –

Respuesta

48

Esto debería funcionar:

import re 
re.sub('<[^>]*>', '', mystring) 

A todos los que opinan que las expresiones regulares no son la herramienta correcta para el trabajo:

El contexto del problema es tal que todas las objeciones con respecto regulares/contexto -Los idiomas libres no son válidos. Su lenguaje esencialmente consta de tres entidades: a = <, b = > y c = [^><]+. Él quiere eliminar cualquier ocurrencia de acb. Esto caracteriza de manera bastante directa su problema como uno que involucra una gramática libre de contexto, y no es mucho más difícil caracterizarlo como uno regular.

Sé que a todos les gusta la respuesta "no se puede analizar HTML con expresiones regulares", pero el OP no desea analizarlo, solo quiere realizar una transformación simple.

+0

Esto no funcionó. Devolvió la cadena original. Gracias aunque –

+0

Lo siento, olvidé el importantísimo carácter '*'. ¿Inténtalo de nuevo? – Domenic

+0

¡Funcionó! Gracias. Eso es todo lo que necesitaba. –

2

Si solo es para analizar y recuperar valor, puede echar un vistazo a BeautifulStoneSoup.

3

Buscar esta expresión regular y reemplazarla con una cadena vacía debería funcionar.

/<[A-Za-z\/][^>]*>/ 

Ejemplo (de Python Shell):

>>> import re 
>>> my_string = '<FNT name="Century Schoolbook" size="22">Title</FNT>' 
>>> print re.sub('<[A-Za-z\/][^>]*>', '', my_string) 
Title 
+0

Eso tampoco funcionó. ¿Podría darme un ejemplo de cómo buscaría y reemplazaría usando esto? Lo intenté y me devolvió la cadena original. –

+0

Agregó un ejemplo. ¿Olvidaste 'importar re'? –

1

Si el texto fuente se XML bien formado, puede utilizar el módulo de stdlib ElementTree:

import xml.etree.ElementTree as ET 
mystring = """<FNT name="Century Schoolbook" size="22">Title</FNT>""" 
element = ET.XML(mystring) 
print element.text # 'Title' 

Si el ISN fuente 'bien formado, BeautifulSoup es una buena sugerencia. El uso de expresiones regulares para analizar las etiquetas no es una buena idea, como lo han señalado varios carteles.

+0

Si FNT contendría otra etiqueta en el medio de "Título", solo se imprimirá la parte hasta la etiqueta interna. – vvondra

-2

Utilice un analizador XML, como ElementTree. Las expresiones regulares no son la herramienta adecuada para este trabajo.

+0

A menos que no se garantice que la entrada sea un XML bien formado, en cuyo caso, es posible que regex sea la única herramienta razonable para el trabajo. También estoy dispuesto a apostar que Regex tendrá un rendimiento significativamente más rápido que manejar la cadena como un documento XML. –

+2

Si la entrada no está bien formada en XML, entonces la implementación de un analizador completo sería la forma correcta de hacerlo. La gramática es lo suficientemente compleja como para que las expresiones regulares no sean suficientes. –

2

Por favor, evite el uso de expresiones regulares. A pesar de que Regex funcionará en su cadena simple, pero tendrá problemas en el futuro si obtiene uno complejo.

Puede usar la función BeautifulSoup get_text().

from bs4 import BeautifulSoup 

text = '<FNT name="Century Schoolbook" size="22">Title</FNT>' 
soup = BeautifulSoup(text) 

print(soup.get_text()) 
Cuestiones relacionadas