Python 从字符串获取区域设置

Python 从字符串获取区域设置,python,regex,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}$') re.compile(r''P[a-z]{2,5})('P[

如果从字符串中提取区域设置时遇到问题,如:

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}$')
re.compile(r''P[a-z]{2,5})('P[a-z]{2,5})){0,1}$)
对于“menu_en”和“menu_en_US”这样的字符串来说,它工作得很好,但是对于“menu_title_en”或“menu_title_en_US”这样的stings,它并没有按预期工作(提取en或en_US)


也许有人能很快想到如何解决这个问题

如果您知道区域设置总是
en
en_us
en_us
(在注释中说明),那么您根本不需要正则表达式:

locale = the_string[-6:]
if not locale.startswith('_en_'):
    locale = locale[3:]
locale = locale[1:]

如果数据可能包含类似于区域设置但不是的内容,则可以添加更多检查——这些检查只是检查下划线加上后面的两个字符

但是,正则表达式也可以稍微固定/简化:

re.compile(r'_(?P<base_code>[a-z]{2})(_(?P<ext_code>[a-zA-z]{2}))?$')
re.compile(r''P[a-z]{2})('P[a-zA-z]{2}))?$)
{0,1}
相同,因为代码总是两个字符,所以您希望
{2]
而不是
{2,5}
。您希望第二个代码接受小写或大写


不过还是会有误报。

你能相信你的区域设置总是
xyz\u xyz
吗,即小写的基本代码和大写的扩展代码?嗨,霍华德,是的,我总是可以依赖本地的beeing en、en\u us或en\u us。这三种模式一直都是一样的。但是ext\u代码也可以是大写的。如果你重新设置,一切都会好的第二个
[a-z]
[a-z]
完成,请参阅。谢谢,又解决了一个问题…还有一个问题:如果我用“menu\u title\u en”尝试,基本代码的结果是“title”,而外部代码的结果是“en”。预期或期望的结果是基本代码的结果是“en”,而外部代码的结果是“None”或“”。我希望这能更好地解释这个问题。啊,但是python怎么知道“title”是不允许的区域设置呢?你必须对照白名单进行检查。嗨,agf,非常感谢你的帮助。问题是我事先不知道区域设置。可以是类似于xx、xx_xx或xx_xx的任何内容。我还尝试了以下方法:((?P[a-z]{2})_(P[a-Z-Z]{2})$|(P([a-Z]{2}))$)相当肮脏和不安全,但“有点效果”那么你说“恩,恩,恩,恩,我们或恩,我们”是什么意思呢?如果你至少不知道代码的长度,那么从“标题”这样的词来判断它是不可靠的。如果你允许使用5个字母的代码,那么你怎么知道“标题”呢从有效的东西?我给的正则表达式假设两个字母代码,我认为这是合理的。你只需要第一组和第三组。哇哦!!!你的正则表达式似乎工作得很好。在的在线正则表达式测试仪似乎欺骗了我很多!对不起,agf,你是对的。仍然会得到误报。但无论如何,谢谢你。@Gernot像我说的,还有其他人说的在评论中,你需要一个白名单才能做到这一点。使用任何类型的模式匹配,你都会得到误报。
re.compile(r'_(?P<base_code>[a-z]{2})(_(?P<ext_code>[a-zA-z]{2}))?$')