从字符串获取区域设置
如果你在处理一个字符串时遇到问题,比如:
menu_title_en_US
menu_title_en
这个字符串中的地区信息是“en_US”。我需要处理的字符串只包含字母、数字和下划线,就像Python中的变量名一样。
到目前为止,我尝试了以下的正则表达式:
re.compile(r'_(?P<base_code>[a-z]{2,5})(_(?P<ext_code>[a-z]{2,5})){0,1}$')
这个正则表达式对于像“menu_en”和“menu_en_US”这样的字符串工作得很好,但对于像“menu_title_en”或“menu_title_en_US”这样的字符串,它的表现就不如预期了(没有正确提取出en或en_US)。
也许有人能快速给出解决这个问题的想法。
1 个回答
1
如果你知道地区设置总是 en
、en_us
或 en_US
(在评论中提到过),那么其实根本不需要用到正则表达式:
locale = the_string[-6:]
if not locale.startswith('_en_'):
locale = locale[3:]
locale = locale[1:]
或者
locale = the_string[-3:]
for code in '_en', '_en_us', '_en_US':
if code.endswith(locale):
break
else:
# no locale found
如果数据中可能包含看起来像地区设置但实际上不是的内容,你可以添加更多的检查——这些检查只会查看下划线后面是否有两个字符。
不过,正则表达式也可以稍微修正和简化一下:
re.compile(r'_(?P<base_code>[a-z]{2})(_(?P<ext_code>[a-zA-z]{2}))?$')
?
和 {0,1}
是一样的,而且因为代码总是两个字符,所以你应该用 {2}
而不是 {2,5}
。你还希望第二个代码可以接受大小写。
不过,这样还是可能会出现误判。