对于我的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显示最完整的匹配?在
斯特凡
不确定您是否已经签出了它,但是this article提供了很多关于进行
Accept-Language
解析的很好的建议,同时还提供了对已经解决问题的库的引用。在至于您的} 。在
re
问题,doughellman在他最近的Python模块中有一个great breakdown of ^{你能用吗?:操作员阻止regex引擎保存带括号的子模式:
这将产生以下输出:
^{pr2}$为了回答您的问题,findall返回的第一个匹配项应该是完全匹配的子字符串。在
将你的内部组(即括号)变成非-捕捉组:也就是说,从:
收件人:
^{pr2}$总而言之,模式符号
(?: ... )
定义了一个非-捕获组:括号仍然用于控制优先级,但不会在匹配对象的.groups()
和其他与捕捉组相关的特征中留下痕迹。在普通括号,
( ... )
,表示一个捕获组。在当然,没有理由使用捕捉组来获取您感兴趣的子匹配。只在你关心的子匹配中使用它们!-)在
相关问题 更多 >
编程相关推荐