RegEx - Coincidir con grupos opcionales

Sé que la expresión regular no es la mejor manera de extraer HTML, pero esto es todo ... Tengo algo como:

<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>

Y necesito hacer coincidir las partes de escritura y arte. Pero no se dice que estén ahí, y podría haber otras partes como Ink and Pencils ...

¿Cómo hago esto? Necesito usar RegEx puro, sin bibliotecas de Python adicionales.

preguntado el 09 de enero de 11 a las 04:01

No es "no es la mejor manera", no es una manera. Si le pido que martille un clavo con un fideo, no lograrlo es culpa mía, no suya. -

Sí claro. No haría eso si no me viera obligado a hacerlo de alguna manera ... a menos que tenga una sugerencia sobre cómo leer un html sin bibliotecas adicionales en Python ... -

Lo siento, no quise sonar duro ... Realmente no necesito leer todas las etiquetas, solo algunas específicas, así que creo que esto se puede hacer ... aunque podría estar equivocado ... ¡gracias! -

Sería muuuy bueno si, solo por una vez, las personas no fueran amonestadas por querer aprender expresiones regulares. Los analizadores XML son ridículamente pesados ​​para muchas situaciones. Imagínese amonestar a cualquier principiante para que no aprenda BÁSICO o C cuando en su lugar podría aprender Java o C # ... pura estupidez. -

5 Respuestas

Quizás haya dos patrones que reconocer.

  1. sus palabras clave existen dentro de un ...
  2. sus palabras clave van seguidas de una sección ...

Entonces ... primero extrae todo lo que hay dentro s ... (código psuedo)

while ( match( "<td[^>]*>(.*?)</td[^>]*>" ) ) {
    inner = match[1];
    ...
}

La (.*?) significa coincidir sin codicia, es decir, igualar el mínimo posible. De lo contrario, coincidirías con todo desde el primero <td> hasta el pasado </td> (en lugar del siguiente </td>).

Luego puede pasar a procesar el inner ¡parte!

Respondido el 10 de enero de 11 a las 14:01

regex = re.compile("(\w+):")
regex.findall(yourString); // returns an array of matching elements

Puedes probarlo Aquí

PD: te recomiendo encarecidamente que revises este

contestado el 23 de mayo de 17 a las 14:05

Creé esto eventualmente:

(Art:|Pencils:|Ink:|Writing:){0,4}.<a href="creator\.php\?c=[^">]*?\"\>(?P<Name>.*?)\</a\>

que parece que está funcionando ... tal vez se pueda pulir un poco. Soy un titular, ya sabes.

Respondido 08 Jul 16, 07:07

Puede hacer coincidir cosas opcionales en expresiones regulares usando un? después de la parte opcional. ? coincidirá con 0 o 1 ocurrencias de una subexpresión.

Respondido el 09 de enero de 11 a las 07:01

A pesar de mi respuesta anterior, cambié de opinión y me gustaría NO tener opciones / alternativas, sino obtenerlas todas. Entonces, esto significa que todo lo que esté dentro de las etiquetas TD debe capturarse y clasificarse adecuadamente. Necesito crear un grupo de captura opcional, de modo que sea cual sea el diseño, todavía puedo recuperar el contenido. Debería funcionar con esto, es decir:

<td>   Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>
<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=BKa">Bob Karp</a> Pencils: <a href="creator.php?c=AT">Al Taliaferro</a> Ink: <a href="creator.php?c=AH">Al Hubbard</a> </td>    
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=VLo">Vic Lockman</a>  Art: <a href="creator.php?c=KWr">Kay Wright</a> </td>
<td> Writing: <a href="creator.php?c=MGa">Michele Gazzarri</a>  Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>

Yo creé:

<td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\ ))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td>

¡Y parece que está funcionando!

Realmente agradecería que alguien verificara y validara mi esfuerzo.

Respondido 08 Jul 16, 07:07

como un segundo pensamiento, simplemente podría haber recuperado los nombres entre las etiquetas y luego quitarlos en Python ... ¡pero lo disfruté! - Maurizio

La dificultad para ti aquí es lidiar con múltiples partidos. Digamos que tienes escritura y arte entre tds ... no sabrá qué número de coincidencia inspeccionar. Sugeriría un proceso de varios pasos. Primero, extraiga todo dentro del tds. Luego, dentro de un ciclo, haga coincidir globalmente (es decir, devuelva un resultado a la vez). Pero parece que está captando bien la sintaxis de las expresiones regulares. - PP.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.