从字符串中获取区域设置

时间:2011-09-22 12:31:18

标签: python regex

如果从字符串中获取语言环境有问题,请执行以下操作:

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 个答案:

答案 0 :(得分: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}。您希望接受第二个代码的小写或大写。

但是,它仍会有误报。