Evan Fosmark ya se dio una buena respuesta. Esto es solo mas información.
está esta línea:
pattern = "6 of(.*)fans"
En general, esto no es una buena expresión regular. Si el texto de entrada era:
"6 de 99 aficionados en toda la galaxia de los aficionados"
A continuación, el grupo de juego (lo que hay dentro de los paréntesis) sería:
"99 aficionados en el conjunto galaxy of "
Por lo tanto, queremos un patrón que solo atrape lo que desee, incluso con un texto de entrada tonto como el anterior.
En este caso, no importa si coincide con el espacio en blanco, porque cuando convierte una cadena en un número entero, se ignora el espacio en blanco. Pero vamos a escribir el patrón para ignorar el espacio en blanco.
Con el comodín *
, es posible hacer coincidir una cadena de longitud cero. En este caso, creo que siempre quiere una coincidencia no vacía, por lo que desea utilizar +
para que coincida con uno o más caracteres.
Python tiene una coincidencia no codiciosa disponible, por lo que puede volver a escribir con eso. Los programas más antiguos con expresiones regulares pueden no tener coincidencias no codiciosas, por lo que también daré un patrón que no requiera no codicioso.
Así, el patrón no expansivo:
pattern = "6 of\s+(.+?)\s+fans"
El otro:
pattern = "6 of\s+(\S+)\s+fans"
\s
significa "cualquier espacio en blanco" y coincidirá con un espacio, un tabulador, y algunos otros caracteres (como "alimentación de formulario"). \S
significa "cualquier espacio no blanco" y coincide con cualquier cosa que \s
sería no coincida con.
El primer patrón lo hace mejor que su primer patrón con el texto de entrada tonta:
"6 de 99 ventiladores en toda la galaxia de los aficionados"
Se volvería un grupo fósforo de poco 99
.
Pero tratar este otro texto de entrada tonta:
"6 de 99 fans enloquecidos"
Se volvería un grupo de 99 crazed
partido.
El segundo patrón no coincidiría en absoluto, porque la palabra "enloquecido" no es la palabra "ventiladores".
Hmm. He aquí un último patrón que siempre debe hacer lo correcto, incluso con los textos de entrada tontas:
pattern = "6 of\D*?(\d+)\D*?fans"
\d
coincide con cualquier dígito ('0'
-'9'
). \D
coincide con cualquier no-dígito.
Esto corresponderá con éxito cualquier cosa que sea remotamente no ambigua:
"6 de 99 ventiladores en toda la galaxia de fans"
El grupo partido será 99
.
"6 de 99 fans enloquecidos"
El grupo partido quedan 99
.
"6 de 99 41 fans"
No va a coincidir, porque había un segundo número de allí. Para obtener más información sobre las expresiones regulares de Python, puede leer variouswebpages. Para un rápido recordatorio, dentro del intérprete de Python, haces:
>>> import re
>>> help(re)
Cuando está "raspado" texto de una página web, es posible que a veces ir en contra de los códigos HTML. En general, las expresiones regulares no son una buena herramienta para ignorar el marcado HTML o XML (ver here); probablemente sea mejor utilizar Beautiful Soup para analizar el HTML y extraer el texto, seguido de una expresión regular para tomar el texto que realmente desea.
Espero que esto haya sido interesante y/o educativo.
* no parece funcionar * no es una descripción del problema –
nota al margen: debe nombrar 'líneas' 'línea' – miku
Publique el texto que intenta hacer corresponder y (si es posible) el resultado esperado. – Mike