Pip 正则表达式搜索

13 投票
3 回答
4054 浏览
提问于 2025-04-18 03:08

我需要在 PyPI 上找到所有符合特定规则的包:

^django-.*?admin.*$

简单来说,包的名字应该以 django- 开头,后面接着 admin 这个词。例如,下面这些包应该符合这个条件:

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

我可以用 pip search django- 来搜索,但会出现很多我不感兴趣的包。

请问 pip 有没有办法通过正则表达式来查找包?还是说我应该把 django- 的搜索结果用 grep 来过滤掉不相关的包呢?

另外,可能把 pip search django-pip search admin 的结果结合起来也会有帮助。

3 个回答

2

一种方法就是上面提到的,把pip搜索的结果通过管道传给grep。如果你只是偶尔需要用到正则表达式搜索,我推荐你使用这个方法。

不过,如果你经常需要这个功能,建议你看看yip这个工具。我写这个工具是为了实现正则表达式搜索,还增加了一些pip搜索做不到的实用功能,比如显示额外的信息(比如大小、上传时间、主页或许可证)或者让输出结果更好看,方便阅读。

3

看起来PyPI的搜索方法不支持正则表达式。Pip使用xmlrpc来进行方法调用,但我在文档中找不到关于search(或者其他任何)方法的信息,甚至在PyPI XML-RPC服务器的methodSignature或methodHelp中也没有。你可以自己写一个脚本来替代grep(不过这样做意义不大)。下面是一个简单的例子:

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()
17

我觉得你要找的就是这个一行代码:

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

你可以把输出结果通过 sort 命令进行排序,得到一个有序的列表。

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

你也可以使用 egrep 命令(想了解两者的区别可以查看 egrep 和 grep 的区别)。

pip search django | egrep "^django-[^ ]*?admin.*$" | sort

解释一下

在管道符 | 后面,我们把 pip 命令的输出结果传给 grep 命令。这里我们使用了 Perl 模式 -P,这是必须的,否则我们无法使用前瞻匹配。

我们用 ^ 来固定模式在字符串的开头,然后直接匹配 django- 这个字面意思。接着我们进行前瞻匹配,确认在这个位置后面可以跟任意数量的短横线或字母数字字符(包括数字和下划线),最后跟上字面字符串 admin

在确认了这一点后,我们就开始尽可能多地匹配短横线和字母数字字符,直到模块名称的结尾。

表达这个的方式有很多种,对于这个简单的模式,变化主要是个人喜好或心情的问题。

如果你想把它改成匹配包含 someworddjango- 模式,只需把 admin 替换成 someword 就可以了。

输出结果

    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.

(列表还在继续。)

顺便提一下,从 pip search 文档 看,我没有找到不使用管道的方法。

撰写回答