点正则表达式搜索

时间:2014-04-17 16:09:53

标签: python regex pip packages

我需要在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 个答案:

答案 0 :(得分:14)

aleckxe,我相信这是你正在寻找的单线。

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

正如下面评论中的铬酸盐所示,如果您愿意,您可以轻松管道以排序排序列表。

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

如果你想要任何调整,请告诉我。

<强>解释

管道|pip命令的输出重定向到<stdin>以获取grep命令后,我们以Perl模式-P输入grep。这是必要的,否则我们将不允许使用前瞻。

我们使用^将模式锚定在字符串的开头,并立即将django-作为文字匹配。然后我们断言(预测)在这个位置我们能够匹配任意数量的破折号或单词字符(包括数字和下划线),然后是文字字符串admin

完成了这个断言(这是一种验证形式)后,我们现在匹配尽可能多的破折号和单词字符,这应该将我们带到模块名称的末尾。

有几种表达方式,对于这种简单的模式,变化很大程度上取决于偏好或情绪。

如果您想更改此设置以匹配包含django-的{​​{1}}模式,只需将someword替换为admin

输出

someword

(列表继续。)

顺便说一句,看pip search documentation,我没有看到没有管道的方法。

答案 1 :(得分:3)

似乎PyPI搜索方法不支持regexp。 Pip使用xmlrpc进行方法调用,但我没有找到任何关于 search (或任何其他)方法的信息,而不是在docs中,甚至找不到methodSignature或methodHelp用于PyPI XML-RPC服务器。您可以创建自己的脚本作为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()

答案 2 :(得分:1)

一种方法是将pip搜索结果传递给grep的上述方法。如果你想使用一次或很少使用正则表达式搜索,我建议使用它。

但是,如果你经常需要这个功能,你应该看看yip这是我写的一个包来完成正则表达式搜索以及其他有用的补充,pip的搜索不能像显示额外的信息(大小,上传时间,主页或许可证)或着色输出以便于阅读。