根据模式匹配here ,匹配项是 213.239.250.131
和 014.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 中,您可以通过在选项中打开它们来查看这些非参与组:
您可以通过删除捕获组来收紧您的正则表达式:
(?:[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/