Skip to main content
 首页 » 编程设计

Python 正则表达式之完全匹配

2025年05月04日29lexus

对于我的 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 返回的第一个匹配项应该是完整匹配的子字符串。