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

如何使用python正则表达式将路由密钥与RabbitMQ主题交换的绑定模式匹配?,python,regex,rabbitmq,Python,Regex,Rabbitmq,我基本上是在研究RabbitMQ。我正在编写一个python代码,其中我试图查看在主题交换的情况下路由键是否与绑定模式匹配。我看到了这个链接,上面写着“但是绑定密钥有两个重要的特殊情况: * (star) can substitute for exactly one word. # (hash) can substitute for zero or more words. 那么,如何将消息的路由密钥与队列的绑定模式匹配呢?例如,消息的路由密钥是“my.routing.key”,而队列是使用绑

我基本上是在研究RabbitMQ。我正在编写一个python代码,其中我试图查看在主题交换的情况下路由键是否与绑定模式匹配。我看到了这个链接,上面写着“但是绑定密钥有两个重要的特殊情况:

* (star) can substitute for exactly one word.

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

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

这是节点库的一个几乎直接的端口:


如果可以的话,我有一些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 + "$");
}
Pattern-toRegex(字符串模式){
最后一个字符串字=“[a-z]+”;
//替换重复的#(这使事情更简单)
pattern=pattern.replaceAll(“\(?:\ \。\)+”,“\”;
//替换*
pattern=pattern.replaceAll(“\\*”,word);
//替换#
//孤独的#
if(“\”.equals(pattern))返回pattern.compile((?:“+word+”(?:\\.“+word+”*));
pattern=pattern.replaceFirst(“^\\”,“(?:“+word+“\\”)*”;
pattern=pattern.replaceFirst(“\\.\”,“(?:\\.“+word+”*”);
//已经不是逃逸的逃逸点

pattern=pattern.replaceAll(“(?我们使用此模式将RabbitMQ模式转换为正则表达式:

from typing import Pattern

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

您能提供输入和所需的输出示例吗?input=“my.routing.key”,pattern=“my.#.*,output=true,这里#表示零个或多个单词,*表示正好一个单词。可能我不够清楚。您收到随机字符串,并且必须说它是否匹配“my.routing.key”?如果是,您甚至不需要正则表达式。只需
string\u进行测试==“my.routing.key”
您不知道,输入字符串必须匹配模式(通配符匹配)my.routing.key必须匹配模式my.#。*很好!我发现了两个可能不需要的匹配,例如
amqp_匹配('a.b.c.),'*.b.#')
amqp_匹配('a..c','...*.*.*.
(虽然如果你的键一开始是合理的,它们就没有问题:)你能提供到C#或VB.NET的转换吗?@DavidP sry regex对我来说是只写代码。不知道是谁发明了这种语法,但我甚至不试图理解在看到模式时发生了什么,即使是我自己写的
from typing import Pattern

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