Tornado请求处理程序映射到国际字符

时间:2013-07-21 18:03:13

标签: python regex unicode tornado

我希望能够匹配某些国际化字符的网址请求,例如/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中设置区域设置似乎不是正确的解决方案。如何设置正则表达式来捕捉é,å,μ等字符?将在python中更改re模式吗?

2 个答案:

答案 0 :(得分:3)

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

Tornado将正则表达式编译为非常深的处理程序模式,因此@ stema建议使用re.Unicode标志很困难,因为它不能立即清楚传递到标志的位置。有两种方法可以解决该特定问题:子类URLSpec并覆盖__init__函数,或在模式中添加标记前缀。

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

不幸的是,由于Tornado在将百分比解码为unicode字符串之前将模式与请求URL 匹配,因此这两个选项都不起作用。因此,使用Unicode标志编译模式没有任何效果,因为您要匹配百分比编码的ASCII URL,而不是Unicode字符串。

答案 1 :(得分:1)

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

如果您想匹配é,å,µ,则需要匹配a-zA-Z0-9的倒数,即[^a-zA-Z0-9]。看看您之前使用\w的方式,您也可以使用与\W相同的[^\w]

祝你好运!

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