Python 正则表达式 - 完全匹配

标签 python regex

对于我的 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/

相关文章:

mysql - 如何在 rsyslog 中仅插入来自常规日志的 mac 地址?

python - 为什么我的 NLTK 函数在处理 DataFrame 时速度很慢?

python - 如何与 Paramiko 的交互式 shell session 进行交互?

java - 用于检索 http ://from the given URL 的正则表达式

css - Rails 4 : how to identify and format links, 主题标签和模型属性中的提及?

.net - 正则表达式跟踪 `)`

Java匹配器和模式: Why does this go on forever

python - 在spyder中使用系统环境变量

python - BERT 微调后得到句子级别的嵌入

Python - OpenCV - 裁剪图像和隔离特定对象