python - 如何使用 REGEX 查找长字符串中的 IP 地址?

标签 python python-3.x regex

我想知道如何从很长的字符串中仅提取正确 IP 地址。 问题是我的代码提取了 IP 地址,即使其中一部分超过 3 位数字(这是不正确的)。

我试图了解有关 Python REGEX 的更多信息,但我不知道如何在点后最多 3 个连续数字处停止它。 我的意思是,如果 IP 是 1.2.3.4 它会正确找到它,这确实是正确的,但如果 IP 是 1.2.3.4567 它也会正确找到它,这是不正确的。我不知道该怎么说如果一个组超过 3 位数字,那么它就不是 IP 地址。

import re

secv = "akmfiawnmgisa gisamgisamgsagr[sao l321r1m r2p4 2342po4k2m4 22.33.4.aer 1.2.3.5344 99.99.99.100 asoifinagf sadgsangidsng sg"

b = re.findall(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.\d{1,3}", secv)

print(b)

它打印 1.2.3.534499.99.99.100,但 1.2.3.5344 不是一个 IP 地址,因为它有超过 3 个连续数字。

最佳答案

import re

secv = "90.123.1.100 akmfiawnmgisa gisamgisamgsagr[sao l321r1m r2p4 2342po4k2m4 22.33.4.aer 1.2.3.5344 99.99.99.100 asoifinagf sadgsangidsng sg 13.18.19.100 1.2.3.4"

b = re.findall(r"(?:\s|\A)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?=\s|\Z)",secv)

b = list(filter(lambda x: all([int(y) <= 255 for y in x.split('.')]), b))


print(b)

为了让它更有趣,我在字符串的开头和结尾添加了 IP 地址。我假设 IP 地址如果不在字符串的开头或结尾,则需要在两侧用空格分隔。因此,我在正则表达式的开头添加了一个非捕获组 (?:\s|\A) ,它将匹配空格字符的开头字符串。我还在正则表达式的末尾添加了一个前瞻断言 (?=\s|\Z),它将匹配单个空白字符或行尾而不消耗任何字符。打印出上面的内容:

['90.123.1.100', '99.99.99.100', '13.18.19.100', '1.2.3.4']

关于python - 如何使用 REGEX 查找长字符串中的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288336/

相关文章:

javascript - HTML 属性的正则表达式多重匹配

python导入模块全局本地命名空间

python - 在 Python 中测试所有组合

python - 游戏过线不起作用。为什么它不能正确显示获胜和失败的比赛?

python - 在Python 3中动态导入模块时出现问题

python - 如何将 python 3.4.3 链接到 opencv?

Python:用单词列表替换句子中的一个单词,并将新句子放在 pandas 的另一列中

python - Django - 从模板传递参数到 View 不起作用

python - Go 中的 urllib.quote() ?

python - 如何等待用户在使用 python 的 Selenium 网络驱动程序中单击按钮?