从字符串获取区域设置

0 投票
1 回答
518 浏览
提问于 2025-04-17 02:50

如果你在处理一个字符串时遇到问题,比如:

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

如果你知道地区设置总是 enen_usen_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}。你还希望第二个代码可以接受大小写。

不过,这样还是可能会出现误判。

撰写回答