Expresiones regulares

Notepad++_LogoLas expresiones regulares forman una sintaxis sencilla para crear patrones de búsqueda y poder buscar y reemplazar cadenas de una forma muy potente. Forman una herramienta muy sencilla y muy eficaz. Por lo que me extraña que su uso sea tan poco popular.

A modo de ejemplo voy a convertir un listado de Abaqus, con todos los inconvenientes que aparecen en estos listados, en un formato más limpio, separado por comas, que es lo que puede importar cualquier hoja de cálculo.

El texto del listado original tiene esta estructura, que se repite tantas veces como elementos aparezcan en el listado (pongo solo un elemento, 21 renglones, aunque el listado original tenía más de 1.500 renglones que dan razón de ser a las expresiones regulares):

                             LE:LE11 (CSYS-1) 
                             SP:1 PI: UPP_RIB_
                             09_LEFT E: 492 IP
                  X                 : 1       

                1.                42.2105E-09 
                1.1              -23.0109E-06 
                1.2              -36.3393E-06 
                1.3              -59.9001E-06 
                1.4              -63.6906E-06 
                1.5              -87.712E-06  
                1.6              -91.9665E-06 
                1.7             -106.4574E-06 
                1.8             -121.189E-06  
                1.9             -136.169E-06  
                2.              -151.407E-06  
                2.1             -166.921E-06  
                2.2             -182.741E-06  
                2.3             -198.92E-06   
                2.4             -215.236E-06  
                2.5             -231.575E-06

La cabecera, de 4 renglones, da una serie de datos del elemento, y el resto de renglones nos ofrecen los valores solicitados para todos los steps.

La herramienta para editar el texto será Notepad++.

Hay que hacer dos familias de operaciones, una para las cabeceras y otra para los renglones de los steps. Empezamos: Ctrl+F para abrir el cuadro de diálogo, y marcamos (abajo a la izquierda) “expresión regular”:

expresion_regular

La cadena que busco es:

\r\n\s*([0-9]\.[0-9]?)\s*([0-9|E|\-|\.]{1,20})

La explico, no es tan difícil:

\ Se emplea para caracteres especiales. En nuestro caso \r\n representa un salto de línea, \s representa un espacio, \. representa un punto y \- representa un guión alto.
* Se emplea para indicar que el último carácter se puede repetir muchas veces (en nuestro caso \s* representa un número indeterminado de espacios que aparecen al principio del renglón.
( ) Se emplean para que la cadena que se encuentra entre paréntesis quede almacenada, para ser incluída en el remplazo.
[] Se emplean para que el siguiente caracter sea alguno de los que aparece entre los corchetes. Si ponemos [0-9] sería cualquier número del 0 al 9.
? Se utiliza para indicar que el carácter podría no aparecer: La cadena [0-9]\.[0-9]? representa un dígito del 0 al 9 (que tiene que aparecer), un punto, y un dígito (que podría no aparecer).
| Representa el operador lógico “o”: [0-9|E|\-|\.] representa un número del 0 al 9 o una E o un punto o un guión alto.
{} los corchetes se utilizan para indicar cuántas veces tiene que aparecer el último patrón: {1,20} indica que el patrón tiene que aparecer, por lo menos, una vez y, como mucho, veinte.

En la búsqueda se han incluído dos paréntesis, cuyo contenido se almacena en memoria. En el campo “Reemplazar con” he puesto:

\r\n\1;\2

Es decir,

\r\n Que vuelva a escribir el salto de linea,
\1 Que escriba el contenido del primer paréntesis,
; Que escriba un punto y coma,
\2 Que escriba el contenido del segundo paréntesis.

Y obtengo ésto:

                             LE:LE11 (CSYS-1) 
                             SP:1 PI: UPP_RIB_
                             09_LEFT E: 492 IP
                  X                 : 1       
1.;42.2105E-09 
1.1;-23.0109E-06 
1.2;-36.3393E-06 
1.3;-59.9001E-06 
1.4;-63.6906E-06 
1.5;-87.712E-06  
1.6;-91.9665E-06 
1.7;-106.4574E-06 
1.8;-121.189E-06  
1.9;-136.169E-06  
2.;-151.407E-06  
2.1;-166.921E-06  
2.2;-182.741E-06  
2.3;-198.92E-06   
2.4;-215.236E-06  
2.5;-231.575E-06

Ya sólo queda limpiar la cabecera, que es lo más turbio:

En la cabecera aparecen los nombres de campo, mezclados con sus valores, sólo separados por dos puntos. Además hay un montón de espacios en blanco y una X que lo complica un poco más.

Supongamos que sólo nos interesa el nombre de la pieza (lo que va después de PI: que para colmo está en dos renglones), el número de elemento (los números de después de E:) y el valor de IP (lo que estaría detrás de IP si no hubiera un salto de renglón, una X y un montón de espacios)…

.*\r\n.*PI\:\s?(.*)\r\n\s*(.*)E\:\s?([0-9]*).*\r\n.*:\s?([0-9]*)

. Representa cualquier carácter, así que .* es cualquier cadena de cualquier longitud…
\: respresenta :
Y todo lo demás ya estaba explicado.

Reemplazamos: El contenido de el primer y el segundo campo van juntos (porque el valor del campo PI estaba en dos renglones) y el resto de campos separados por punto y coma:

\1\2;\3;\4

De forma que ya tenemos lo que queríamos:

UPP_RIB_09_LEFT ;492;1       
1.;42.2105E-09 
1.1;-23.0109E-06 
1.2;-36.3393E-06 
1.3;-59.9001E-06 
1.4;-63.6906E-06 
1.5;-87.712E-06  
1.6;-91.9665E-06 
1.7;-106.4574E-06 
1.8;-121.189E-06  
1.9;-136.169E-06  
2.;-151.407E-06  
2.1;-166.921E-06  
2.2;-182.741E-06  
2.3;-198.92E-06   
2.4;-215.236E-06  
2.5;-231.575E-06

Para un texto tan corto no parece tener mucha utilidad, pero cuando el listado tiene miles de renglones, o tienes muchos listados abiertos (y se puede reemplazar en todos los archivos abiertos) las expresiones regulares ahorran muchísimo trabajo.

Y ésto es sólo un ejemplo, pero hay muchos más operadores que nos permiten afinar las búsquedas.

Anuncios

Acerca de Pablo Nieto Cabezas

Arquitecto

Publicado el 15 abril, 2013 en Informática, Tecnología y etiquetado en , , . Guarda el enlace permanente. 32 comentarios.

  1. Hola Dan. Para hacer eso puedes probar con

    en Buscar: ([0-9]+)
    y en
    Reemplazar: lo dejas vació

  2. Yo quisiera me ayudaran con lo siguiente:
    1. AAAAAAAAAAAAAAAAAAAAAAAAAA
    2. ****TEXTO TEXTO TEXTO**** BBBBBBBBBBBBB
    3. CCCCCCCCCCCCCCCCCC

    Quisiera que lo que esta entre los asteriscos suba y el resto baje… que me quede asi:

    1. AAAAAAAAAAAAAAAAAAAAAAAAAA****TEXTO TEXTO TEXTO****
    2. BBBBBBBBBBBBB
    3. CCCCCCCCCCCCCCCCCC

    Existe alguna manera de hacerlo con expresiones regulares.. Gracias… espero ayuda.

    • Debes buscar \r\n(\*{1,4}(.*)\*{1,4})
      y reemplazar por \1\r\n

      Es decir, buscas:
      \r\n salto de linea
      (paréntesis para que lo guarde como reemplazo)
      \*{1,4} asteriscos, entre uno y cuatro seguidos…
      .* Lo que sea que se puede repetir muchas veces
      \*{1,4} Lo de antees, uno, dos, tres o cuatro asteriscos

      Y reemplazas por
      \1 Lo que había antre paréntesis
      \r\n salto de linea…

  3. Hola Pablo.. Te pregunto ¿esta respuesta es para mi?

    Los asteriscos que allí aparecen (Perdón por no especificar) representan cadenas de códigos

    1. AAAAAAAAAAAAAAAAAAAAAAAAAA
    2. (Codigo *>)TEXTO TEXTO TEXTO(Código )BBBBBBBBBBBBB
    3. CCCCCCCCCCCCCCCCCC

    Quisiera que lo que esta entre los asteriscos suba y el resto baje… que me quede asi:

    1. AAAAAAAAAAAAAAAAAAAAAAAAAA (Codigo *>)TEXTO TEXTO TEXTO(Código )
    2. BBBBBBBBBBBBB
    3. CCCCCCCCCCCCCCCCCC

    es que no me aparecen acá..

    • Sí era para tí.
      La cosa es, entonces, que estructures la búsqueda así:
      Buscar [salto de línea] [patron de incio] [contenido] [patron de final]
      Algo así:
      \r\n (Código*> .* Código)
      Al meterlo en el paréntesis, se guarda en el primer campo. y reemplazas por
      \1\r\n
      Si pones el ejemplo concreto, buscamos el patrón que te lo resolvería (que no será Código*> )

  4. Pablo Fue perfecto, si me funcionó… Gracias..!

  5. Hola, tengo lo siguiente:
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

    (Codigo)Aaaaaaaaaaaaaaaaaaaa(Codigo)

    cccccccccccccccccccccccccccccccc

    quiero que me quede asi:

    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    (Codigo)Aaaaaaaaaaaaaaaaaaaa(Codigo) cccccccccccccccccccccccccccccccc

    Gracias una vez mas… me he beneficiado mucho con su ayuda… Gracias

  6. Hola, me ayudan por favor?

    Quiero detectar un rango de texto. Explico:

    Tengo:
    {Linea vacía}
    TEXTO VARIADO TEXTO VARIADO TEXTO TEXTO
    TEXTO VARIADO 2 TEXTO VARIADO 2 TEXTO VARIADO 2 TEXTO
    TEXTO VARIADO 3 TEXTO VARIADO3 TEXTO VARIADO 3 TEXTO
    {Linea vacía}
    TEXTO……

    Lo que quiero hacer es eliminar el texto que está entre las lineas vacías (No siempre es el mismo numero de lineas)

  7. Hola gente
    Necesitaria eto

    Tengo el texto Figure 20 y la tendría que reemplazar por Figure 5
    la figure 21 la tendría que reemplazar por la figure 6
    y asi …..

    Mi pregunta es si hay alguna expresión matemática como por ejemplo 20-15 =5
    en forma dinamica para todos

    Espero contestación gracias

  8. Quien me Puede Ayudar con Expresiones Regulares en notepad++ o otro software que cumpla la función.
    Quiero dentro del Primero Apellido y Segundo Agregar los siguientes signos “;”
    Ejemplo
    “99999999-1″;”GREMLER ZEH PETER HANS FRIEDRICH”;”VAR”;”METROPOLITANA DE SANTIAGO”;”SANTIAGO”;”LO BARNECHEA”
    la idea que quede así :
    “99999999-1″;”GREMLER”;”ZEH PETER HANS FRIEDRICH”;”VAR”;”METROPOLITANA DE SANTIAGO”;”SANTIAGO”;”LO BARNECHEA”

  9. Hola, ¿puedes ayudarme con estos patrones? ¿Cómo debería buscar y reemplazarlos?
    29-3-1998 tiene que ser 29-03-98
    29/3/1998 tiene que ser 29-03-98
    29 de marzo tiene que ser 29-03
    29 de marzo de 1998 tiene que ser 29-03-98

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: