3

我希望能够匹配一些国际化字符的 URL 请求,例如/Comisión. 这是我的设置:

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [ 
            '''some handlers, and then this: '''
            (r"/([\w\:\,]+)", InternationalizedHandler)
            ]
            tornado.web.Application.__init__(self, handlers, **settings)

但是在 Tornado 中设置语言环境似乎不是正确的解决方案。如何设置正则表达式来捕获é、å、µ等字符?会改变repython中的模式吗?

4

2 回答 2

3

TL;DR:使用 Tornado 的内置路由器是不可能的。

Tornado 将处理程序模式的正则表达式编译埋得很深,所以@stema 使用该re.Unicode标志的建议很困难,因为目前尚不清楚在哪里传递标志。有两种方法可以解决这个特定问题:子类化URLSpec并覆盖__init__函数,或者在模式中放置一个标志前缀。

第一个选项是很多工作。第二个选项利用 Pythonre模块中的一个特性,其中模式可以(?u)在模式的开头指定,而不是将re.UNICODE标志作为参数传递。

不幸的是,这两个选项都不起作用,因为 Tornado 在将请求 URL百分比解码为 un​​icode 字符串之前将模式与请求 URL 匹配。因此,使用 Unicode 标志编译模式无效,因为您匹配的是百分比编码的 ASCII URL,而不是 Unicode 字符串。

于 2013-07-22T16:13:43.500 回答
1

如果你看这里,你会看到你的表达“意味着”什么:http ://regex101.com/r/zO9zC8

如果要匹配é,å,µ,则需要匹配 的倒数a-zA-Z0-9,即[^a-zA-Z0-9]\w看你之前是怎么用的,你也可以用和 .\W一样的[^\w]

祝你好运!

编辑:重新阅读您的问题,我建议您改为关注@stemas 答案。

于 2013-07-21T18:32:28.980 回答