Búsqueda de expresiones regulares de pip

Necesito encontrar todos los paquetes en PyPI que coincidan con una expresión regular en particular:

 ^django-.*?admin.*$ 

Básicamente, el nombre del paquete debe comenzar con django- y tener la palabra admin después. Por ejemplo, los siguientes paquetes deben coincidir:

 django-redis-admin django-admin-ckeditor django-admintools-bootstrap 

Puedo hacer pip search django- , pero hay una gran cantidad de paquetes que no me interesan.

¿ pip proporciona una manera de encontrar paquetes por una expresión regular? O, ¿debería simplemente canalizar los resultados de django- a grep para filtrar paquetes irrelevantes?

Además, probablemente una “intersección” de pip search django- y pip search admin podría ayudar también.

Aleckxe, creo que esta es la línea que está buscando.

 pip search django | grep -P "^django-(?=[-\w]*?admin)[-\w]+" 

Según lo sugerido por chromate en el comentario a continuación, usted podría fácilmente canalizar para ordenar una lista ordenada si lo desea.

 pip search django | grep -P "^django-(?=[-\w]*?admin)[-\w]+" | sort 

Déjame saber si quieres algún cambio.

Explicación :

Después de la tubería | que redirige la salida del comando pip a para el comando grep, ingresamos grep en modo Perl -P . Esto es necesario, de lo contrario no podríamos usar un lookahead.

Anclamos el patrón al principio de la cadena con ^ e inmediatamente django- coincidir django- como un literal. Luego afirmamos (lookahead) que en esta posición podríamos hacer coincidir cualquier número de guiones o caracteres de palabra (que incluyen dígitos y guiones bajos), seguido de la cadena literal admin .

Una vez hecha esta afirmación (que es una forma de validación), ahora hacemos coincidir todos los guiones y caracteres de palabras que podamos, lo que nos debe llevar al final del nombre del módulo.

Hay varias formas de express esto y para este patrón simple, las variaciones son en gran medida una cuestión de preferencia o estado de ánimo.

Si alguna vez quiso cambiar esto para que coincida django- patrones de django- que contienen someword , simplemente reemplace admin con someword .

La salida :

  django-smoke-admin - django-smoke-admin tests that all admin pages for all registered models responds correctly (HTTP 200). django-adminskin - UNKNOWN django-admin-exporter - Simple admin actions to download/export selected items in CSV, JSON, XML, etc. django-treeadmin-fork-alt-storage - Tree UI for mptt-managed models, extracted from FeinCMS. This is a fork with support for alternative storage engines django-relatedadminwidget - Get edit and delete links in your django admin. A utility class to let your model admins inherit from. django-admin-langswitch - Adds easy language switch in admin django-authy-admin - A drop in replacement for django's default admin site that provides two-factor authentication via authy's REST API. django-frontendadmin - A a set of templatetags to allow an easy and unobstrusive way to edit model-data in the frontend of your page. django-admin-app-names-singleton - Django admin enhancer django-mobileadmin - The Django admin interface for mobile devices. 

(La lista continua.)

Por cierto, mirando la documentación de búsqueda de pip , no veo una manera de hacer esto sin la tubería.

Parece que el método de búsqueda PyPI no soporta regexp. Pip use xmlrpc para llamadas a métodos, pero no pude encontrar ninguna información para buscar (o cualquier otro) método que no esté en documentos o incluso con methodSignature o methodHelp para el servidor PyPI XML-RPC. Puedes crear tu propio script como alternativa para grep (pero no tiene mucho sentido). Ejemplo rápido:

 from xmlrpclib import ServerProxy import re URL = 'https://pypi.python.org/pypi' TEST_RE = r"^django-.*?admin.*$" TEST = 'django-' def main(): pypi = ServerProxy(URL) res = pypi.search({'name': TEST}) for r in res: m = re.match(TEST_RE, r['name']) if m: print(m.group(0)) if __name__ == '__main__': main() 

Un enfoque es el método mencionado anteriormente que canaliza los resultados de búsqueda de pip a grep. Recomiendo usar esto si desea usar la búsqueda de expresiones regulares una vez o raramente.

Sin embargo, si necesita esta función con regularidad, debería revisar yip, que es un paquete que escribí para realizar búsquedas de expresiones regulares junto con otras adiciones útiles que la búsqueda de pip no puede hacer, como mostrar información adicional (tamaño, tiempo de carga, página de inicio o licencia) o colorear la Salida para legibilidad.