对于我的 CGI 应用程序,我正在编写一个函数来获取浏览器的首选语言(在 HTTP_ACCEPT_LANGUAGE 变量中提供)。我想用正则表达式找到这个变量中的所有语言标签(语言标签的一般模式在 RFC1766 中定义)。来自 RFC1766 的 EBNF('1*8ALPHA' 表示一到八个 ASCII 字符):
Language-Tag = Primary-tag *( "-" Subtag )
Primary-tag = 1*8ALPHA
Subtag = 1*8ALPHA
我为语言标签写了这个正则表达式:
(([a-z]{1,8})(-[a-z]{1,8})*)
如果我使用这个表达式,Python 的 re 模块提供以下内容
>>import re
>>re.findall("(([a-z]{1,8})(-[a-z]{1,8})*)", "x-pig-latin en-us de-de en", re.IGNORECASE)
[('x-pig-latin', 'x', '-latin'), ('en-us', 'en', '-us'), ('de-de', 'de', '-de'), ('en', 'en', '')]
结果正确。但我只需要像“de-de”或“x-pig-latin”这样的完整匹配项。我可以假设一组的第一场比赛总是最完整的吗?或者是否有一个标志告诉 re 显示最完整的匹配项?
斯特凡
最佳答案
您可以使用 ?: 运算符来防止正则表达式引擎保存括号中的子模式:
((?:[a-z]{1,8})(?:-[a-z]{1,8})*)
这给出了输出:
re.findall("((?:[a-z]{1,8})(?:-[a-z]{1,8})*)", "x-pig-latin en-us de-de en", re.IGNORECASE)
['x-pig-latin', 'en-us', 'de-de', 'en']
要回答您的问题,findall 返回的第一个匹配项应该是完整匹配的子字符串。
关于Python 正则表达式 - 完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669236/