Perdón por el título de la mala pregunta, no pude encontrar una mejor.

Necesito una expresión regular que extraiga la temporada, el episodio y el título de las transcripciones de programas de televisión. En mi archivo pueden aparecer así:

<span class="topic">01x02 - The Big Bran Hypothesis</span><b
<td><b>01x07 - The Dumpling Paradox</b></td>
<title>Transcripts - Forever Dreaming :: 01x07 - The Dumpling Paradox - The Big Bang Theory</title>
<title>Transcripts - Forever Dreaming :: 06x04 - The Re-Entry Minimisation - The Big Bang Theory</title>

Lo intenté con:

([\d]+x[\d]+)\s?[-]?\s?([\w\s]*)

Consulte ejemplo de Regex101 aquí

Esta expresión regular coincide con:

01x02 - The Big Bran Hypothesis
01x07 - The Dumpling Paradox
01x07 - The Dumpling Paradox
06x04 - The Re

El problema al que me enfrento es cómo obtener el resto del título del último ("La minimización de reingreso") sin " - The Big Bang Theory".

Intenté agregando un - en el segundo grupo de captura, pero esto también incluye la parte después del título.

También intenté agregar una anticipación positiva para - pero esto tampoco puede funcionar, ya que coincide con el primer - después de la temporada y el episodio también.

Supongo que es bastante sencillo cómo hacer esto, pero no puedo entenderlo. ¿Alguien tiene una idea? ¡Gracias!

1
Igle 15 dic. 2016 a las 21:51

2 respuestas

La mejor respuesta

Esta expresión regular coincidirá con éxito con un título con guión, mientras evita el nombre del programa final: (\d+)x(\d+) ?- ?([-\w\s]+) -

Producirá los siguientes grupos de captura:

  1. Temporada
  2. Episodio
  3. Título

Descompostura:

  • (\d+)x(\d+) coincide y captura la temporada y el episodio, cada uno en su propio grupo
  • ?- ? coincide con el delimitador de guiones, con o sin espacios
  • ([-\w\s]+) - captura cualquier letra, guión y espacio, pero solo hasta un guión con espacios alrededor, que parece ser la única distinción entre uno dentro del título y después de él.

Consulte la demostración de regex101.

Nota: si realmente necesita que toda la coincidencia excluya el nombre del programa, en lugar de usar los grupos específicos, simplemente cambie - a una anticipación positiva (?= - ) para que no coincidir con el guión final.

1
Brian Stephens 15 dic. 2016 a las 20:07

Esto debería funcionar:

(\d{2}x\d{2} - [\w\s]*(-\w)?[\w\s]*)

También le devuelve un segundo grupo, pero simplemente puede ignorarlo. O, en realidad, puede usar la coincidencia completa simplemente con

\d{2}x\d{2} - [\w\s]*(-\w)?[\w\s]*

----- editar -----

Para ser correcto, el truco consiste en considerar que las palabras pueden dividirse con guiones ignorando los guiones reales.

La siguiente expresión regular es más general y coincide con algo como "fuera de la caja":

\d{2}x\d{2} - ([\w\s]*(-\w)?)*
0
Antonio Ken Iannillo 15 dic. 2016 a las 19:36