python - 正则表达式:为什么在 re.findall() 中包含空字符串(在元组列表中)?

标签 python regex

根据模式匹配here ,匹配项是 213.239.250.131014.10.26.06

然而,当我运行生成的 Python 代码并打印出 re.findall(p, test_str) 的值时,我得到:

[('', '', '213.239.250.131'), ('', '', '014.10.26.06')]

我可以破解列表及其元组以获得我正在寻找的值(IP 地址),但是 (i) 它们可能并不总是在元组中的相同位置并且 (ii) 我会而是了解这里发生了什么,这样我就可以收紧正则表达式,或者使用 Python 自己的 re 功能仅提取 IP 地址。

为什么我会得到这个元组列表,为什么明显的空格匹配,以及我们如何确保只返回 IP 地址?

最佳答案

每当您使用 capturing group ,它总是返回一个子匹配,即使它是空的/空的。您有 3 个捕获组,因此您将始终在 findall 结果中找到它们。

在 regex101.com 中,您可以通过在选项中打开它们来查看这些非参与组:

enter image description here

您可以通过删除捕获组来收紧您的正则表达式:

(?:[a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

甚至 (?:[a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}|\d{1,3 }(?:\.\d{1,3}){3}.

参见 a regex demo

并且由于正则表达式模式不包含捕获组,re.findall将只返回匹配项,而不是捕获组内容:

import re
p = re.compile(r'(?:[a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
test_str = "from mail.example.com (example.com. [213.239.250.131]) by\n mx.google.com with ESMTPS id xc4si15480310lbb.82.2014.10.26.06.16.58 for\n <alex@example.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256\n bits=128/128); Sun, 26 Oct 2014 06:16:58 -0700 (PDT)"
print(re.findall(p, test_str))

online Python demo 的输出:

['213.239.250.131', '014.10.26.06']

关于python - 正则表达式:为什么在 re.findall() 中包含空字符串(在元组列表中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791936/

相关文章:

regex - 将 JavaScript 正则表达式转换为 Swift 正则表达式

c# - Regex.IsMatch 不应该返回 true

python - 使用 Git/PyCharm 维护 Python 项目的精简版和专业版

python - 如何将附加参数(除了参数)传递给函数?

Javascript 匹配函数

php - 在删除/替换非单词字符时处理 unicode

javascript - 匹配 "doesn' t"包含单词的文本的正则表达式?

python - 使用 Beautifulsoup for XML 在一个级别上获取标签名称

python - 如何在 Python 中将多个值附加到列表中

python - for 循环中 for 循环的更快替代方案