Corregir un texto (II): los diálogos
El otro día vimos qué era una expresión regular y cómo nos puede ayudar a corregir un texto (en la parte ortotipográfica; ya sabemos que el argumento, los personajes, el ritmo y esas cosas no se pueden automatizar). Por decirlo rápidamente, una expresión regular permite buscar patrones en un texto.
En esta entrada vamos a repasar los principales errores (con las acotaciones) que se cometen al escribir diálogos y veremos expresiones regulares que nos ayudarán a detectarlos, para acabar con una única expresión regular que nos marcará los errores.
Imagino que ya tienes tu documento en un editor de texto como el notepad++, si no es así echa un vistazo a la anterior entrada.
Sintaxis
Aunque la sintaxis de las expresiones regulares es compleja y variada (y me supera en muchos aspectos), vamos a ver únicamente aquellos elementos que nos interesan, para no complicar en exceso las cosas. No obstante, un listado detallado de campos puede obtenerse de este enlace del propio notepad++. Vamos allá.
[...]
Este patrón nos permite buscar un carácter determinado, que es uno de los incluidos entre corchetes.
Algunas abreviaturas son: [A-Z] coincide con cualquier letra mayúscula, [a-z] minúscula (aunque hay que tener en cuenta que en nuestro caso hay que añadir las tildes y la ñ). Por su parte, [0-9] busca cualquier dígito. Finalmente, eso lo podemos concatenar: [A-Za-z0-9].
Por ejemplo, [AC][A-Z3][ZX] es un patrón que busca: A o C, seguido de una mayúscula o el número 3, seguido de la Z o la X. Es decir, encontraría cadenas como A3Z, CCX, CFX, etc. Pero no AC1 (el '1' no está dentro del último corchete), A5X, AC13X, etc.
[^...]
El patrón coincide con cualquier carácter excepto los incluidos. Es decir, [^AC03] es un patrón que coincide con cualquier carácter menos con uno de esos cuatro.
\w
El patrón coincide con un carácter de palabra: una letra, un dígito o un guion bajo. Aparentemente notepad++ incluye las vocales acentuadas y la ñ. El equivalente sería [A-Za-z0-9ÁÉÍÓÚÑáéíóúñ_].
\s
El patrón contiene un espacio, una tabulación o un salto de línea.
.
El punto hace coincidencia con cualquier carácter: letras, números, símbolos, espacios, tabulaciones, etc. Es útil, por ejemplo, si estamos buscando una cadena que sabemos cómo empieza y cómo acaba, pero nos da igual lo que haya en el medio.
+
El patrón contiene una o más repeticiones del carácter anterior. Por ejemplo, [AB]+ encontraría cualquier cadena que contuviese al menos una A o una B: AAA, ABBAB, ABBBBAABB, etc.
*
El patrón contiene cero o más instancias del carácter anterior. Esto es útil cuando sabemos que podemos encontrar un carácter, pero que quizá no. Por ejemplo, los espacios que hay tras el punto en una frase.
?
El patrón contiene cero una instancia del carácter anterior.
^
El patrón comienza a buscar por el comienzo de la línea (excepto cuando va entre corchetes, que este carácter actúa de manera diferente, ver arriba).
$
El patrón coincide con el fin de línea.
|
Separa las diferentes opciones dentro de una expresión regular. Por ejemplo, la expresión regular sí|no|nsnc encuentra los "sí", los "no" y los "nsnc" dentro de un texto.
★ ★ ★
Si todavía no tienes claro de qué va esto, te pongo un ejemplo. Supongamos que tenemos un texto en el que durante la revisión, al cambiar la puntuación, se nos han escapado algunas mayúsculas, y queremos asegurarnos de que después de un punto y coma, una coma o dos puntos, siempre hay una minúscula.
Lo que haríamos sería ir a buscar y poner la siguiente expresión:
[;:,] [A-ZÁÉÍÓÚÑ]
Este patrón buscará un punto y coma, dos puntos o una coma, seguida de un espacio y una letra en mayúscula. Si queremos asegurarnos de que tenemos en cuenta que después de la puntuación puede venir un signo de exclamación o interrogación, pondríamos lo siguiente:
[;:,] [¡¿]*[A-ZÁÉÍÓÚÑ]
Lo único que hemos hecho con la cadena [¡¿]* es ampliar el patrón para que también haga coincidencia si antes de la letra encuentra un símbolo (como hemos visto antes, "*" significa cero o más).
Un aspecto importante con las expresiones regulares es que los espacios se tienen en cuenta como caracteres, por lo que hay que tener cuidado de no añadir ningún espacio adicional al final de la expresión.
★ ★ ★
Visto esto, pasamos ahora a revisar los principales errores que se cometen al escribir un diálogo. Lo mejor es que copies la frase en el editor, luego la expresión, y veas cómo lo detecta.
Error 1
Comenzar con guion, en lugar de raya.
Versión incorrecta
-Pregúntale a Pepe qué está haciendo.
Versión correcta
—Pregúntale a Pepe qué está haciendo.
Qué buscamos
Un guion como primer carácter de una línea.
Expresión regular
^-
Error 2
Poner un espacio después de la raya de diálogo. Vamos a aprovechar e incluir en la regla las comillas angulares de cierre (»), que se utilizan cuando un personaje continúa el diálogo en la siguiente línea, y que tampoco llevan un espacio.
Versión incorrecta
— Pepe, ¿qué estás haciendo? —pregunta Rafa.
Versión correcta
—Pepe, ¿qué estás haciendo? —pregunta Rafa.
Qué buscamos
Comienzo de línea, raya, espacio y cualquier carácter.
Expresión regular
^[—»]\s.
Error 3
No dejar un espacio antes de la raya de acotación, tras la intervención del personaje (después del cierre interrogante). Nótese que estoy asumiendo que la acotación puede comenzar con exclamación o interrogante, que es posible aunque no se me ocurre un ejemplo.
Versión incorrecta
—¿A ti qué te parece que estoy haciendo?—responde Pepe.
Versión correcta
—¿A ti qué te parece que estoy haciendo? —responde Pepe.
Qué buscamos
Cualquier cosa menos un espacio, raya y un carácter de inicio de acotación.
Expresión regular
[^\s]—[¡¿\w]
Error 4
Acabar la intervención del personaje con un punto, y tras la raya de acotación empezar con minúscula, por ejemplo, porque es un verbo de habla (recuerda que tienes que tener marcado el check de mayúsculas/minúsculas).
Versión incorrecta
—No lo sé. —le contesta Rafa.
Versión correcta
—No lo sé —le contesta Rafa.
Qué buscamos
Un punto, cero o más espacios, una raya y una letra minúscula.
Expresión regular
\.\s*—[a-záéíóúñ]
Error 5
Acabar la acotación introduciendo un espacio entre la última letra y la raya. Hay que tener en cuenta que el punto y los cierres de las exclamaciones e interrogaciones son caracteres especiales, por lo que para que los interprete como símbolos, les pondremos un "\" delante.
Versión incorrecta
—¿Y por qué te interesa? —pregunta Pepe de nuevo —. Metomentodo.
Versión correcta
—¿Y por qué te interesa? —pregunta Pepe de nuevo—. Metomentodo.
Qué buscamos
Un carácter de palabra o un signo de cierre, un espacio o más, una raya y un signo de puntuación o un espacio.
Expresión regular
[\w\?\!]\s+—[\.:;,\s]
Error 6
Este es muy habitual. Acabar la acotación con un punto antes de la raya, en lugar de ponerlo después de la raya. En este caso aplica lo mismo
Versión incorrecta
—Pues porque eres mi primo —dice Rafa.— Por eso.
Versión correcta
—Pues porque eres mi primo —dice Rafa—. Por eso.
Qué buscamos
Un carácter de cierre de acotación, un punto y una raya.
Expresión regular
[\?\!\w]\.—
Error 7
Empezar la acotación con mayúscula, sin haber acabado la intervención del personaje con un punto. Esto detectará tanto aquellos casos en los que nos hemos dejado el punto, como los que son verbos de habla que hemos comenzado con mayúsculas.
Versión incorrecta
—No será por eso —Enojado, Pepe se da la vuelta.
Versión correcta
—No será por eso. —Enojado, Pepe se da la vuelta.
Qué buscamos
Cualquier cosa menos un punto (y los cierres de exclamación e interrogación), seguida de un espacio, raya y letra mayúscula.
Expresión regular
[^\.\?\!] —[A-ZÁÉÍÓÚÑ]
Error 8
Nuestro último error es acabar una línea de diálogo con raya y punto, cuando nunca puede acabar así.
Versión incorrecta
—Pues no lo será —contesta Rafa—.
Versión correcta
—Pues no lo será —contesta Rafa.
Qué buscamos
Un carácter de palabra, una raya, un punto, 0 o más espacios (por si tras el punto hay algún espacio, lo que es habitual) y el final de la línea.
Expresión regular
\w—\.*\s*$
★ ★ ★
Bien, ya tenemos nuestros ocho errores de diálogo habituales. Seguro que podemos pensar más patrones, pero de momento es suficiente. Tenemos dos opciones: ir aplicando uno por uno, que es un poco engorroso, o aplicarlos todos a la vez. Y como soy un poco vago, eso es lo que vamos a hacer. Así que simplemente ponemos el carácter | separando cada expresión, y el resultado es el siguiente (es todo una misma línea).
^-|^[—»]\s.|[^\s]—[¡¿\w]|\.\s*—[a-záéíóúñ]|[\w\?\!]\s+—[\.:;,\s]|[\?\!\w]\.—|[^\.\?\!] —[A-ZÁÉÍÓÚÑ]|\w—\.*\s*$
Asusta, sí, pero no lo toques. Simplemente lo copias en la casilla de "Buscar" y pinchas en buscar todo, y te indicará los "matches" (coincidencias) que ha encontrado. A continuación vas a "Buscar" y uno a uno los vas revisando.
Ten en cuenta que no siempre todos serán errores, porque puede haber casos en los que por diferentes circunstancias el patrón coincida con algo que no es un error. Por ejemplo, si la intervención de un personaje acaba en interrogante, la acotación comenzará en minúscula si es un verbo de habla o similar, y en mayúscula en cualquier otro caso, y saber si en ese caso va minúscula o mayúscula sólo lo puede decir el contexto:
—¿Me estás escuchando? —dice Pepe.
—¿Me estás escuchando? —Se escucha un ruido al otro lado de la puerta.
Lo que nos interesa es evitar los falsos negativos (un error que no es detectado), aunque sea a costa de los falsos positivos (un error que no lo es).
En la imagen siguiente está arriba el diálogo con los errores, y debajo sin ellos. Pincha en la imagen para ampliar.
Te preguntarás si además de buscar, no reemplazamos también, pero eso es más complicado cuando se trata de expresiones regulares. Quizá más adelante. De todas formas, soy reacio a sustituir de otra forma que no sea a mano, y menos cuando hablamos de "Reemplazar todo", porque siempre hay casos que se salen de la norma, y puedes estar añadiendo errores en lugar de eliminarlos.
★ ★ ★
Si te apetece "jugar" un poco con la expresión regular o añadirle nuevas cosas, puedes acceder a la web regular expresions 101, donde tienen una plataforma para probar expresiones regulares. Esta expresión (la versión más actualizada) es accesible en el siguiente enlace: https://regex101.com/r/CRu1mw/1.
Aunque aparecerá marcado si accedes mediante el enlace, para que sea compatible con lo que hemos hecho, tiene que estar activado el multilínea y el "flavor" python (lo marco en la imagen con amarillo). A continuación, pones arriba la expresión regular y debajo el texto, y él solo colorea las coincidencias. A la derecha tienes varias cosas útiles, como una guía de referencia rápida y la explicación detallada de la expresión regular.
Es posible que tengas que incrementar el tiempo máximo de ejecución, pinchando en la llave inglesa debajo de la imagen del perfil, y cambiando el parámetro "Max execution time". Pincha en la imagen para ampliar.
★ ★ ★
De momento, esto es todo.
Si detectas algún error (que es posible que los haya), hay algún caso que quieras contemplar en el caso de los diálogos o tienes alguna sugerencia, mándame un email a manuel@benetnavarro.es y lo vemos. Si te sirve de ayuda, agradeceré saberlo :)
El próximo día veremos algunos errores habituales de puntuación, y según cómo de complejo sea, quizá algo más.