Expresiones regulares y traducción (parte II)

Hola y saludos otoñales (casi invernales) a todos (los del hemisferio norte, en el sur, al revés):

En el anterior post de esta serie sobre expresiones regulares vimos la introducción general y el uso de los operadores básicos (caracteres literales, punto, corchetes, guión y acento circunflejo).

En esta segunda parte de la serie vamos a centrarnos en los caracteres con un significado especial más allá del propio literal: los metacaracateres. Los metacaracteres sirven para identificar o encontrar patrones de texto o formato que, de otra manera, resultaría bien imposible, bien muy complejo. En una implementación general de la sintaxis de las expresiones regulares nos encontramos con la siguiente selección de metacaracteres habituales, que presento en un cuadro para que pueda usarse como referencia rápida.

Metacaracteres de búsqueda

\ (barra invertida): la barra invertida sirve para anular (o “escapar” en términos informáticos) un metacaracter de forma que se utilice como un carácter literal. Por ejemplo, si hacemos una búsqueda por \\n (como veremos a continuación, \n es un metacaracter para un salto de línea manual) estaremos indicando que en lugar de buscar un salto de línea se busque el carácter de barra invertida seguido del carácter n (práctica habitual en programación para suprimir, por ejemplo, los saltos de línea y cambiarlos a otra cosa).

\f (barra invertida y f): sirve para identificar o buscar los caracteres de salto de página en formato electrónico (se trata de un carácter que manda la instrucción a la impresora).

\n (barra invertida y n): sirve para encontrar un carácter de salto de línea en un documento (de hecho, \n es la forma de insertar una línea nueva en muchos lenguajes de programación como C o C++).

\r (barra invertida y r): sirve para encontrar un carácter de retorno de carro (cuando se pulsa la tecla Intro para pasar la siguiente línea, como cuando se empujaba la palanca de cambio de línea en una máquina de escribir antigua).

\t (barra invertida y t): sirve para encontrar un carácter de tabulación horizontal (el que se inserta al pulsar la tecla Tab del teclado).

\v (barra invertida y v): sirve para encontrar un carácter de tabulación vertical (en ASCII tiene asignado el 11).

[\b] (corchete apertura, barra invertida, b y corchete de cierre): permite identificar un carácter de retroceso en un texto.

\d (barra invertida y d): se trata de uno de los metacaracteres más útiles y usados. Permite buscar cualquier dígito, es decir, es lo mismo que escribir [0-9] para usar un intervalo, tal y como vimos en el post anterior. Por ejemplo, al buscar \d euros en un editor compatible con regexp clásicas (por ejemplo, EditPad Lite), encontraríamos en un texto tanto 5 euros como 7 euros.

\D (barra invertida y D mayúscula): sirve para justamente lo contrario a lo anterior, es decir, para buscar todo lo que no sean dígitos. Se trata por tanto, del equivalente a [^0-9].

\w (barra invertida y w): otro de los metacaracteres más utilizados ya que permite localizar cualquier carácter alfanumérico (en mayúscula o minúscula) y el guión bajo. Por tanto, es igual al patrón [a-zA-Z0-9_]. Por ejemplo, con la búsqueda [Cc][Rr]\w encontraríamos tanto CR7 como crocs.

\W (barra invertida y W mayúscula): sirve para lo contrario a lo anterior, es decir, encontrar un carácter no alfanumérico ni un guión bajo; sería el equivalente a [^a-zA-Z0-9_]. Se puede utilizar para buscar caracteres de formato (párrafo, saltos, etc.) u otros como #.

\s (barra invertida y s): sirve para encontrar cualquier tipo de carácter de espacio en blanco. Es por tanto equivalente a [\f\n\r\t\v]. Por ejemplo, al buscar por \s en el texto Uno y dos, el texto que se identificaría serían los espacios en blanco (Unoydos).

\S (barra invertida y S mayúscula) lo contrario a lo anterior, es decir, lo mismo que [^\f\n\r\t\v]. Nos permite encontrar un carácter del tipo de todo lo que es “visible” al ojo humano en un texto.

\b (barra invertida y b): este metacaracter es muy útil porque sirve para marcar una posición de un carácter dentro de una palabra. Habitualmente se usa para buscar caracteres al principio. Por ejemplo: al buscar por \barm se encontrarían las palabras armadura y arma, pero no harmónica puesto que el patrón de búsqueda arm no está al principio de palabra en el último caso. Aunque se usa especialmente para marcar el inicio de una palabra, \b también sirve para marcar el final; por ejemplo, la búsqueda ato\b serviría para encontrar pazguato, pero no atornillar. Por último, si se combina el uso para inicio y final de palabra, lo que obtenemos es el equivalente a la búsqueda de palabra completa; por ejemplo, \bagua\b encontrará agua pero no aguantar. Por su uso, este es un metacaracter marcador de posición dentro de una palabra.

\B (barra invertida y B mayúscula): sirve para no encontrar un carácter en los límites de una palabra. Se usa, por ejemplo, para localizar guiones de separación en palabras en inglés (no hay espacios a los lados) con regexp como \B-\B, con las que se obtendrían resultados como taskrelated.

^ (acento circunflejo): fuera de un corchete, el acento circunflejo sirve para marcar el inicio de una cadena completa. Ojo, hemos dicho cadena, no palabra. En términos habituales, esto significaría comienzo de una frase en una nueva línea. Por ejemplo, ^\w nos serviría para localizar el primer carácter alfanumérico de una frase o cadena. En algunas implementaciones se suele ver \A en lugar de ^.

$ (símbolo del dólar): sirve para lo mismo que el metacaracter anterior, solo que en este caso se encuentra el final de una cadena. Por ejemplo, :$  nos permitiría encontrar todas las cadenas que terminen en dos puntos. En algunas implementaciones se suele ver \Z en lugar de $.

Como podemos intuir, la combinación de estos metacaracteres con los patrones de búsquedas tratados en el primer artículo de esta serie sobre expresiones regulares multiplica las prestaciones de las que disponemos. A modo de ejemplo práctico en el mundo de la traducción, podemos ver la combinación de caracteres literales y comodines (metacaracteres) en la creación de reglas de control de calidad o QA en la mayoría de las herramientas CAT del mercado. Habitualmente, las funciones de QA operan de la siguiente manera:

1) Se busca la aparición (o ausencia) de un patrón determinado en el texto de origen y

2) Se compara el resultado del primer paso para verificar la existencia (o no existencia) de dicho patrón en el texto de destino.

En concreto y para verlo con más claridad, vamos a definir una regla que busque los números con punto como separador de decimales en el texto de origen y que en el texto de origen NO tengan como separador de decimales una coma.

a) Expresión regular para el texto de origen: \d\.\d.

– Explicación: expresión formada por cualquier número (\d), punto (como punto es un metacaracter por sí mismo, lo escapamos con la barra invertida) y de nuevo cualquier número.

– Resultado: se encontraría, por ejemplo, 10.1, 512,684.58, 4.6.

b) Expresión regular para el texto de destino: [^\d,\d].

– Explicación: expresión formada por cualquier número (\d), coma y de nuevo cualquier número.

– Resultado: se encontraría, por ejemplo, 10,1, 512.684,58, 4,6.

Como se observa, en realidad lo que se hace es decirle al programa mediante una expresión regular lo siguiente “si en un segmento de origen encuentras un número, un punto y otro número y en el segmento de destino correspondiente hay un número separado de otro por algo que no sea una coma, genera un error de QA para que lo compruebe”. En concreto, en este caso vemos como en el número 512.684,58 se habría producido un falso positivo (¡el tema de los falsos positivos daría para otro post!), puesto que aquí el punto separa las unidades de millar, no los decimales. En el resto de casos, no habría habido ningún problema.

QA reg exp en SDLX

Expresión regular para función de QA en SDLX

Esta última explicación y ejemplo es uno de los casos más habituales de uso de las expresiones regulares. No obstante, existen muchos más escenarios como, entre otros, el filtrado de cadenas en el editor de traducción, la extracción de cadenas en la ingeniería de traducción con patrones complejos, etc. La verdad es que una vez se dominan bien todos los operadores básicos, cada cual es capaz de idear aplicaciones de lo más variopintas en su trabajo y su día a día.

En este segundo artículo de la serie sobre regexp hemos tratado los metacaracteres como complementos indispensables para los operadores de regexp básicos a fin de buscar y encontrar patrones textuales más sofisticados. Pero, ¿no sirven todos estos metacaracteres vistos para localizar caracteres individuales? En el ejemplo [^\d,\d], ¿no se resaltaban con la búsqueda únicamente el número anterior (\d) y posterior al separador de decimales (,\d)? ¿Qué pasa si queremos buscar más números o caracteres y combinar en una búsqueda patrones más grandes en que se repitan caracteres, espacios en blanco, etc.?

Obviamente, todo eso se pensó al diseñar las expresiones regulares, así que nosotros lo veremos en el siguiente post de esta serie, donde trataremos la búsqueda y creación de repeticiones de caracteres y búsquedas, los cuantificadores, las subexpresiones y muchas más cosas con las que podremos aprovechar toda la potencia que nos brindan las regexp.

Mientras tanto, como en el caso anterior, a practicar con lo ya aprendido, ¿de acuerdo?

Nos leemos en más o menos un mes. Ah, y como siempre, perdonad que me enrolle tanto y termine por escribir post larguísimos. Un saludo a todos,

Álvaro

Recomendación musical: tras casi dos años de espera si no me equivoco, mis apreciados Stereophonics vuelven a la carga con nuevo material y sello discográfico propio. Aquí va el single titulado In A Moment.

3 comentarios el “Expresiones regulares y traducción (parte II)

  1. […] los últimos meses publiqué una serie de artículos sobre expresiones regulares (parte I, parte II y parte III) y me llegaron algunos correos electrónicos privados con preguntas, consultas y […]

  2. Paula Mahler dice:

    Hola Álvaro: mi pregunta será por algo mucho menos complicado que esta cuestión de las expresiones regulares. Uso SDL Trados 2011 para documentos únicos y para paquetes de proyecto.
    Pero acaban de encargarme una traducción grande que repartiré con otros traductores y supongo que tendré que usar la opción Proyecto, aunque realmente no sé como convertirme en PM.
    Mis dudas son varias:
    a) ¿Divido el documento total y cada documento por separado entrará en el proyecto general?
    b) Enviaré archivos word a los traductores pero, ¿qué archivos me envían ellos? (Antes, cuando usaba las versiones anteriores, el archivo sin limpiar servía a los efectos de tener lengua fuente y lengua meta).
    c) ¿Se incorporan los archivos que ellos me mandan a la memoria de traducción de mi proyecto?
    Si tienes tips armados sobre esto o sabes dónde puedo consultarlo, la verdad es que me vendría muy bien.
    Saludos otoñales y con terribles lluvias e inundaciones desde el sur del mundo.
    Paula

    • alvaromira dice:

      Hola, Paula. Perdona el retraso, ya supongo que será un poco tarde.
      En realidad tienes diferentes opciones:
      1- Si tienes el documento original, dividirlo ahí directamente y crear un proyecto para cada parte.
      2- Crear un proyecto único y luego enviar diferentes subpaquetes con un recuento determinado.
      3- Abrir el archivo grande, guardarlo para crear un sdlxliff. A continuación, utilizas el complemento de división de archivos sdlxliff para dividir el archivo creado en partes y, a continuación, creas un proyecto con esas partes. Así puedes analizarlo todo mejor.

      En respuesta a tus preguntas:
      a) Respondida vía los puntos anteriores.
      b) Mi consejo es que envíes a tus traductores paquetes de proyecto completamente configurados (con TM, referencias, terminología, etc.) para que ellos solamente tengan que traducir. Ellos deberían devolverte paquetes de retorno con los archivos sdlxliff traducidos por completo (serían los archivos bilingües) que tú luego limpiarías para generar los archivos finales.
      c) No. Tú misma eres la que tienes que ejecutar la tarea por lote de actualización de la TM y elegir qué y cómo quieres actualizar la TM.

      Creo que eso es todo. No obstante, me has dejado en bandeja de plata una idea para un artículo del blog nuevo. ¡Gracias, Paula!
      Un saludo ya primaveral desde España.

      Álvaro

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