Cosas Interesantes

sábado, 16 de enero de 2010

Aprendiendo a usar EXPRESIONES REGULARES (RegEx) en SIGIL para retocar los libros de Mi PAPYRE 6.1 reader

PAPYRE STREETDesde PAPYRE STREET, Coco va a ayudarnos hoy a manejar RegEx, lo que seguramente nos será muy útil para mejorar nuestros  ebooks. Vamos a utilizar como ejemplo unas búsquedas sobre el programa SIGIL, que es estupendo pero tiene el problemilla de que sólo genera la TOC (tabla de contenidos) para lo que esté incluido entre etiquetas heading (1 a 6); por lo que uno se encuentra con que hay que recrear el índice del libro desde cero. Y si uno tiene 78 capítulos divididos en 6 libros, se puede tirar un buen rato, además de saltarse alguno o cometer algún error. Coco profesor Está técnica RegEx está disponible en todo tipo de programas, desde OFFICE WORD a lenguajes de programación como PYTHON; o el famoso GREP de LINUX.

RegEX: Buscar y Sustituir mediante EXPRESIONES REGULARES 
RegEx
es simplemente un “lenguaje” para BUSCAR y REEMPLAZAR texto. Es muy potente y tremendamente productivo cuando se sabe utilizar. Digo “lenguaje” entre comillas porque desgraciadamente NO ES UN ESTANDAR y los distintos motores de búsqueda RegEx incluidos en las distintas aplicaciones o lenguajes tienen diferencias en su sintaxis. En cualquier caso, una vez entendido el concepto no es mucho problema. SIGIL utiliza las convenciones de notación heredadas de Qt, el entorno de desarrollo que se ha usado para programarlo; aunque he leido que el autor está pensando sustituirlo por PCRE, que es la biblioteca PERL para RegEx incluida en C y sus variantes o en cualquier lenguaje de programación que permita usar librerias (Visual Basic).

¿Que hace RegEx y cómo lo hace?
RegEx
permite buscar cadenas de texto sin declarar explicitamente sus componentes, lo que hace que sea posible encontrar cosas como: “un texto de 5 caracteres junto a 3 números al final de una palabra”, es decir permite añadir variables e incluso lógica a la busqueda de cadenas. Y a la hora de reemplazar permite definir que partes de la cadena deben ser reemplazadas y cuales no, lo que permite una flexibilidad completa. Pero todo esto es mucho más fácil de describir con un ejemplo.
EJEMPLO PRÁCTICO image Necesito quitar los <p class="calibre2"> y </p> que estan alrededor del grupo <img class=”calibre6”.../>

  Voy a buscar cuantos tengo en el texto:

image


El problema para seleccionar las 13 ocurrencias a la vez es que lo que sigue a  <...src=../images/...p> es variable ya que son los diferentes nombres de los gráficos insertados en el libro. Asi que en realidad lo que quiero encontrar son 2 cadenas fijas con una parte variable (PV)en el centro:
<p class="calibre2"><img class="calibre6" src=(PV)/></p>
Voy a construir la RegEx que me seleccione esa parte variable:
Escribo entre corchetes los componentes que hay, para empezar “puntos” (.) y “barra inversa” (/) y como hay más de uno le pongo el asterisco (*) al final que significa “que el numero sea indifente”.



image
Si compruebo con “Contar” SIGIL me dice que ha encontrado 13 ocurrencias, luego vamos bien. Pero además hay números y letras, que podrán ser mayusculas o minusculas (no lo sé cierto); asi que los añado a la expresión de búsqueda:
imageCompuebo y sigo teniendo 13 ocurrencias, parece que ya he encontrado la parte variable (PV)luego sólo me resta añadir la cadena fija del final que empieza en la comilla (“) de cierre
image
Asi pues la expresión RegEx de búsqueda es:
<p class="calibre2"><img class="calibre6" src="[./a-zA-Z0-9]*" /></p> Pero ahora crear la expresión de sustitución:
Lo primero para poder reemplazar es que la parte/s variable/s de la expresión de búsqueda debe/n encerrarse entre parentesis ():
<p class="calibre2"><img class="calibre6" src="([./a-zA-Z0-9]*)" /></p>
Y ahora vamos con la expresión de sustitución:
Como queremos quitar la parte de los <p class="calibre2"> y </p> será:
<img class="calibre6" src="([./a-zA-Z0-9]*)" />

pero sustituimos todas las partes variables (lo que está entre parentesis) por “\número”; es decir si tuvieramos 2 partes variables sustituiriamos por “\1” y “\2”. En nuestro caso queda así:
<img class="calibre6" src="\1" />
image image Le damos al botón de “Replace All”…
image image Como vemos ha realizado correctamente la sustitución. De un solo golpe 13 reeemplazos. Como veis, tremendamente útil.

En http://gskinner.com/RegExr/ teneis una página que puede ayudar a aprender y entender las expresiones regulares
http://www.regular-expressions.info/charclass.html
Vamos a seguir trabajando más ejemplos de RegEx (Expresiones Regulares) en próximas entradas, porque esta ya está quedando muy larga.

Y recordad, niños, esto es CERCA image1 y esto es LEJOS image31

1 comentario

  1. Hola, en el epub que he probado encuentro errores como los que señalas, pero mediante la búsqueda con Sigil me dice "the search term cannot be found". ¿Qué hago mal?

    ResponderEliminar

© Cosas Interesantes