我可以用Python正则表达式匹配字母、连字符和下划线吗?
我想处理一些地理名称,比如 /new_york 或 /new-york 等等。因为 new-york 是用 Django 的 slugify 处理过的,所以我可能应该使用这种格式的名称,尽管用下划线的名称看起来更好。这样做的原因是我可能想通过像 Django slugify 这样的算法来自动生成 URL。我猜 ([A-Za-z]+)
或者简单的 ([\w-]+)
可能可以用,但为了保险起见,我想问一下在这种情况下哪个正则表达式更合适。
我已经有一个正则表达式可以处理数字,比如把数字连接到一个类上:
('/([0-9]*)', ById)
#这个可以根据 ID 获取并显示一个实体
现在我想要另一个正则表达式来匹配名称,比如 new_york,这样当请求 /new_york 时,就能由合适的处理程序来处理。基本上,我需要一个与上面的正则表达式相反的表达式,或者是字母+下划线的组合,可能还包括一个短横线,因为这些名称都是地理名称。我觉得我可以用这个正则表达式,但我认为它只因为优先级的原因而能处理所有内容:
('/(.*)', ByName)
#这个处理像 /new_york 的实体,/sao_paulo 的实体等,通过我相关地点的自定义映射。
因为我还有其他处理程序,我不想让正则表达式冲突,并且我还有其他请求处理程序,你能推荐一下我该如何制定正则表达式吗?
当一个表达式同时符合两个正则表达式时,它是怎么工作的?哪个优先级更高?你能告诉我更多关于如何学习写正则表达式的内容,以及在地理数据存储中可能的实现方式吗?比如作为实体或实例变量,还有一些特殊问题,比如地理位置在不同语言中有不同的名称,比如德国在德语中叫 Deutschland,所以我也想应用翻译,这可以通过 gettext / djang.po 文件来实现。
1 个回答
第一个匹配的就算赢。
通常情况下,你的URL在路径的其他部分会有所不同。例如,你可能会有:
/cities/(?P<city>[^/]+)
/users/(?P<user>[^/]+)
在很多情况下,使用 [^/]+ 是个不错的正则表达式,因为它会匹配除了 / 以外的任何东西,而 / 通常是用来分隔路径元素的,所以我们一般会避免它。
我觉得仅仅根据字符(在你的例子中是字母或数字)来分隔URL并不是个好主意,但如果你真的想这么做,可以使用 [-A-Za-z_]+
(注意,"-"要放在方括号的最前面,或者需要加反斜杠)。
要避免使用 \w
,因为它也会匹配数字。除非你想要非常复杂的处理,把数字只发送给一个处理程序,而把字母和数字发送到其他地方,这种情况下可以使用:
/(?P<id>\d+)
/(?P<city>[-\w]+)
按这个顺序。