gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:40:08 37 4
gpt4 key购买 nike

根据模式匹配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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com