2012-09-23 12 views
6

He cambiado a Python hace poco y estoy interesado en limpiar una gran cantidad de páginas web (alrededor de 12k) (pero pueden considerarse archivos de texto igual de fáciles)) al eliminar algunas etiquetas particulares o algunos otros patrones de cadena. Para esto estoy usando la función re.sub (..) en Python.Reemplazo usando expresiones regulares múltiples o una más grande en Python

Mi pregunta es si es mejor (desde el punto de vista de la eficiencia) crear una gran expresión regular que coincida con más de mis patrones o llamar a la función varias veces con expresiones regulares más pequeñas y simples.

Para ejemplificar, es mejor usar algo así como

re.sub(r"<[^<>]*>", content) 
re.sub(r"some_other_pattern", content) 

o

re.sub(r"<[^<>]*>|some_other_pattern",content) 

Por supuesto, en aras de ejemplificar los patrones anteriores son muy simples y no los han recopilado aquí, pero en mi escenario de la vida real lo haré.

LE: La pregunta no está relacionada con la naturaleza HTML de los archivos, sino con el comportamiento de Python cuando se trata de varios patrones de expresiones regulares.

Gracias!

+2

[Advertencia obligatoria sobre el análisis de HTML con expresiones regulares] (http://stackoverflow.com/a/1732454/950912) – brc

+0

En realidad, como he dicho, no se trata principalmente de eliminar y analizar texto HTML, sino de eliminar algunas Patrones relacionados con HTML. Mi pregunta también se puede hacer de forma general sobre archivos de texto simples y reemplazando un montón de patrones en ellos –

+0

Creo que todo se reduce a lo bueno que eres con expresiones regulares ... si puedes hacerlo con uno que no uses uno ... probablemente lo dividiría en varios, así que es más fácil de analizar humano ... –

Respuesta

3

Hazlo simple.

Yo diría que estás más seguro usando Regexes más pequeños para analizar todo esto. Al menos de esa manera si se comporta de forma anormal, no tienes que ir a cavar para encontrar qué sección particular de Regex masiva se está comportando de manera extraña. Siempre que tenga un buen registro de los reemplazos que realice, sería trivial determinar la fuente del problema, en caso de que surja.

Usted no quiere encontrarse con this

2

Hablando en términos generales, "secuencial" y la aplicación "paralelo" no es lo mismo y podría producir resultados diferentes, debido a las sustituciones secuenciales se afectan entre sí.

En cuanto al rendimiento, creo que una expresión tendrá un mejor rendimiento, pero eso es solo una suposición. Personalmente, prefiero mantener complejo y utilizar el modo "detallado" para la lectura.

1

Entiendo su comentario adicional con respecto a "son las partes no HTML que estoy limpiando". Debido a la posibilidad de que un último RE encuentre y reemplace el contenido que un RE anterior reemplazó, sería mejor usar el operador "alternativo" y usar un único RE.

Además, considere usar BeautifulSoup para cargar y examinar sus archivos HTML. Esto ayudará a encontrar las partes apropiadas de su texto con mucho menos riesgo de capturar algún constructo HTML cuando usted solo tenía la intención de reemplazar algún texto.

Cuestiones relacionadas