如何使用python regex匹配RabbitMQ主题交换的路由键和绑定模式?

2024-04-23 07:54:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我基本上在做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.

那么如何将消息的路由键与队列的绑定模式相匹配呢?例如,消息的路由密钥是“我的.routing.key”队列绑定到主题交换,绑定模式为“my.\.*”。一般来说,如何匹配这些字符串模式以进行主题交换,最好使用python regex。在


Tags: 代码httpscom消息路由主题for队列
3条回答

我们使用此模式将RabbitMQ模式转换为regex:

from typing import Pattern

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

我有一些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 + "$");
}

也许有人能把它翻译成植物。在

这几乎是节点库amqp-match的直接端口:

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

相关问题 更多 >