【问题标题】:Pip regular expression searchpip 正则表达式搜索
【发布时间】:2014-06-02 00:37:02
【问题描述】:

我需要在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 的“交叉点”可能也会有所帮助。

【问题讨论】:

  • 您有什么理由不想将 pip 搜索结果通过管道传输到 grep 中?
  • @hackyday 如果 pip 不支持它,或者没有第三方软件包可以做到这一点,那么我可以使用 pipe+grep 选项。谢谢。
  • 很高兴知道反对票的原因。渴望得到反馈。谢谢。

标签: python regex pip packages


【解决方案1】:

alecxe,我相信这就是您正在寻找的单线。

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

正如下面评论中 chromate 所建议的那样,如果您愿意,您可以轻松地通过管道对排序列表进行排序。

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

如果您需要任何调整,请告诉我。

说明

在管道|pip 命令的输出重定向到<stdin> 用于grep 命令之后,我们在Perl 模式下输入grep -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 documentation,我没有看到没有管道的方法。

【讨论】:

  • 或者pip search django | egrep "^django-[^ ]*?admin.*$" | sort 也是一个好主意,以获得排序列表。我认为这是一个品味问题,但我更喜欢egrep 而不是输入grep -P。另请参阅stackoverflow.com/questions/18058875/… 了解两者之间的差异。
  • @chromate 好主意,谢谢,添加了归于铬酸盐的排序建议。 :) 我很喜欢grep -P,但我想每个男人都有他最喜欢的古龙水。
  • 这是一个非常棒且全面的答案 - 感谢您的贡献。
  • @alecxe 写它给了我很多乐趣。很高兴它有效,谢谢你的鼓励。 :)
【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多