Python正则表达式完全匹配

2024-06-16 11:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的CGI应用程序,我正在编写一个函数来获取浏览器的首选语言(在HTTP_ACCEPT_language变量中提供)。我想用正则表达式找到这个变量中的所有语言标记(语言标记的一般模式在RFC1766中定义)。来自RFC1766的EBNF('1*8ALPHA'表示一到八个ASCII字符):

Language-Tag = Primary-tag *( "-" Subtag )
Primary-tag = 1*8ALPHA
Subtag = 1*8ALPHA

我为语言标记编写了以下正则表达式:

^{pr2}$

如果我使用这个表达式,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显示最完整的匹配?在

斯特凡


Tags: 函数标记re语言应用程序tagdeen
3条回答

不确定您是否已经签出了它,但是this article提供了很多关于进行Accept-Language解析的很好的建议,同时还提供了对已经解决问题的库的引用。在

至于您的re问题,doughellman在他最近的Python模块中有一个great breakdown of ^{}。在

你能用吗?:操作员阻止regex引擎保存带括号的子模式:

((?:[a-z]{1,8})(?:-[a-z]{1,8})*)

这将产生以下输出:

^{pr2}$

为了回答您的问题,findall返回的第一个匹配项应该是完全匹配的子字符串。在

将你的内部组(即括号)变成-捕捉组:也就是说,从:

(([a-z]{1,8})(-[a-z]{1,8})*)

收件人:

^{pr2}$

总而言之,模式符号(?: ... )定义了一个-捕获组:括号仍然用于控制优先级,但不会在匹配对象的.groups()和其他与捕捉组相关的特征中留下痕迹。在

普通括号,( ... ),表示一个捕获组。在

当然,没有理由使用捕捉组来获取您感兴趣的子匹配。只在你关心的子匹配中使用它们!-)在

相关问题 更多 >