如果从字符串中获取语言环境有问题,请执行以下操作:
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)。
也许有人知道如何解决这个问题。
答案 0 :(得分: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}
。您希望接受第二个代码的小写或大写。