当前位置: 首页 > 知识库问答 >
问题:

如何使用python正则表达式将路由密钥与RabbitMQ主题交换的绑定模式相匹配?

郎鸿
2023-03-14

我基本上是在RabbitMQ上工作。我正在编写一个python代码,其中我正在尝试查看在主题交换的情况下路由密钥是否与绑定模式匹配。我遇到了这个链接 - https://www.rabbitmq.com/tutorials/tutorial-five-java.html 它说 - “但是绑定键有两个重要的特殊情况:

* (star) can substitute for exactly one word.

# (hash) can substitute for zero or more words.

那么如何将消息的路由键与队列的绑定模式相匹配呢?例如,消息的路由键是“my.routing.key”,队列绑定到具有绑定模式的主题交换 - “my.#.*”。一般来说,我如何匹配这些字符串模式进行主题交换,最好是我希望使用python正则表达式。

共有3个答案

朱锦
2023-03-14

我们使用此模式将RabbitMQ模式转换为正则表达式:

from typing import Pattern

def convert(pattern: str) -> Pattern:
    pattern = (
        pattern
        .replace('*', r'([^.]+)')
        .replace('.#', r'(\.[^.]+)*')
        .replace('#.', r'([^.]+\.)*')
    )
    return re.compile(f"^{pattern}$")
楚举
2023-03-14

如果对你有帮助的话,我有一些Java代码

Pattern toRegex(String pattern) {
    final String word = "[a-z]+";

    // replace duplicate # (this makes things simpler)
    pattern = pattern.replaceAll("#(?:\\.#)+", "#");

    // replace *
    pattern = pattern.replaceAll("\\*", word);

    // replace #

    // lone #
    if ("#".equals(pattern)) return Pattern.compile("(?:" + word + "(?:\\." + word + ")*)?");

    pattern = pattern.replaceFirst("^#\\.", "(?:" + word + "\\.)*");
    pattern = pattern.replaceFirst("\\.#", "(?:\\." + word + ")*");

    // escape dots that aren't escapes already
    pattern = pattern.replaceAll("(?<!\\\\)\\.", "\\\\.");

    return Pattern.compile("^" + pattern + "$");
}

也许有人能把它翻译成python。

锺离烈
2023-03-14

这是节点lib amqp匹配的一个几乎直接的端口:

import re

def amqp_match(key: str, pattern: str) -> bool:
    if key == pattern:
        return True
    replaced = pattern.replace(r'*', r'([^.]+)').replace(r'#', r'([^.]+.?)+')
    regex_string = f"^{replaced}$"
    match = re.search(regex_string, key)
    return match is not None
 类似资料:
  • 我正在寻找一种在RabbitMQ中进行分层路由的方法。我试图在留档中找到答案,但突然失败了。 通常,RabbitMQ允许您通过某个路由密钥连接到直接交换机,但我不清楚如何在多个交换机之间进行路由。 例如,假设我们有“根”交换和“主机1”交换,路由键为“主机1”。我有一个通过路由键绑定到“主机1”交换的队列。我可以用routing_key发布消息到“根”交换吗,比如“主机1.31261”?显然,它不

  • 使用以下路由键将两个队列绑定到主题交换: 队列A,与路由密钥模式匹配绑定。foo队列B,与路由密钥模式匹配绑定。条形码 我想在此交换中添加第三个队列,该队列接收的消息既不是foo消息,也不是bar消息。如果我用路由键绑定这个队列,我自然会得到我需要的所有消息,但包括我不想要的foo和bar。 路由消息的任何方式都可以修补模式<代码>非*。foo和NOT*。条形码?

  • 有没有一种方法可以在python中编写与以下格式的字符串匹配的正则表达式: 或 在这里,$=表示零或更多的空白可以存在 :来自字符串的固定子集的字符串['feat','fix','docs','断'] :最大长度为n的字符串 :最大长度为m的字符串 前缀应该始终是一个字符串,之后是一些最大q长度的字母数字字符 注意:我们不能省略像应该使用与下面示例中所示完全相同的格式: feat(feat new

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 我想检查一个字符串是否匹配1-2个字母,1-4个数字和1个字母的模式。(例如: CC44C , C4444C )。 我知道这将完全匹配2个字母,4个数字和1个字母的模式。(例如: CC4444C ) 但是,如何使它与范围(即1-2个字母,1-4个数字)匹配的模式呢? 我已经尝试过,但是它给了我以下错误: 问题答案: 您需要将{1-2}更改为{1,2},您可以理解为{minimun,ma

  • 寻找以下规则验证密码的帮助: 8个字符 包含至少1个大写字母 包含至少1个小写字母 包含至少一个数字 不能以数字开头 不包含特殊字符 我已经做到了: