Tengo algo como esto:
extensionsToCheck = ['.pdf', '.doc', '.xls']
for extension in extensionsToCheck:
if extension in url_string:
print(url_string)
Me pregunto cuál sería la forma más elegante de hacer esto en Python (sin usar el bucle for). Estaba pensando en algo como esto (como de C / C ++), pero no funcionó:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Editar: estoy un poco obligado a explicar cómo esto es diferente a la pregunta a continuación, que está marcada como duplicado potencial (por lo que no se cierra, supongo).
La diferencia es que quería verificar si una cadena es parte de alguna lista de cadenas, mientras que la otra pregunta es verificar si una cadena de una lista de cadenas es una subcadena de otra cadena. Similar, pero no exactamente lo mismo, y la semántica es importante cuando buscas una respuesta en línea en mi humilde opinión. Estas dos preguntas buscan resolver el problema opuesto el uno del otro. Sin embargo, la solución para ambos resulta ser la misma.
fuente
Respuestas:
Use un generador junto con
any
, que cortocircuita en el primer Verdadero:EDITAR: veo que esta respuesta ha sido aceptada por OP. Aunque mi solución puede ser una solución "suficientemente buena" para su problema particular, y es una buena forma general de verificar si alguna cadena de una lista se encuentra en otra cadena, tenga en cuenta que esto es todo lo que hace esta solución. No le importa DONDE se encuentre la cadena, por ejemplo, al final de la cadena . Si esto es importante, como suele ser el caso con las URL, debe buscar la respuesta de @Wladimir Palant, o corre el riesgo de obtener falsos positivos.
fuente
any
negará algunas de las posibles ganancias que proporciona el cortocircuito, porque toda la lista tendrá que construirse en todos los casos. Si usa la expresión sin corchetes (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
), lax.lower() in [...]
parte solo se evaluará hasta que se encuentre un valor Verdadero.any()
solo devolverá verdadero o falso , pero vea la respuesta de comprensión de la lista de @psun a continuación con esta modificación:print [extension for extension in extensionsToCheck if(extension in url_string)]
fuente
Es mejor analizar la URL correctamente, de esta manera puede manejar
http://.../file.doc?foo
yhttp://.../foo.doc/file.exe
correctamente.fuente
Use listas de comprensión si desea una solución de línea única. El siguiente código devuelve una lista que contiene la url_string cuando tiene las extensiones .doc, .pdf y .xls o devuelve una lista vacía cuando no contiene la extensión.
NOTA: Esto es solo para verificar si contiene o no y no es útil cuando se desea extraer la palabra exacta que coincida con las extensiones.
fuente
any
solución, en mi opinión, es una de las mejores soluciones posibles para esa pregunta.any()
mi opinión, esta es superior a la solución porque también se puede modificar para devolver el valor de coincidencia específico, así:print [extension for extension in extensionsToCheck if(extension in url_string)]
(vea mi respuesta para obtener detalles adicionales y cómo extraer la palabra coincidente , así como el patrón de la url_string)Comprueba si coincide con esta expresión regular:
Nota: si sus extensiones no están al final de la URL, elimine los
$
caracteres, pero lo debilita ligeramentefuente
Esta es una variante de la respuesta de comprensión de la lista dada por @psun.
Al cambiar el valor de salida, en realidad puede extraer el patrón de coincidencia de la comprensión de la lista (algo que no es posible con el
any()
enfoque de @ Lauritz-v-Thaulow)Además, puede insertar una expresión regular si desea recopilar información adicional una vez que se conoce el patrón coincidente (esto podría ser útil cuando la lista de patrones permitidos es demasiado larga para escribir en un solo patrón de expresiones regulares)
fuente