Python中如何用正则表达式精准匹配IP地址?

news2025/4/15 1:35:32

在网络编程和数据处理时,我们经常需要从文本中提取或验证IP地址。Python的正则表达式(re模块)是完成这个任务的利器。但你知道怎么写才能准确匹配各种合法的IP地址吗?今天我们就来详细探讨这个问题。

为什么需要IP正则表达式?

假设你正在分析服务器日志,需要提取其中的IP地址。或者你在开发一个网络工具,要验证用户输入的IP是否合法。手动解析IP地址既麻烦又容易出错,这时候正则表达式就能派上大用场了。

IP地址的基本结构

一个合法的IPv4地址由4个0-255的数字组成,用点号分隔。比如:

  • 合法的:192.168.1.1、10.0.0.1
  • 非法的:256.1.1.1(数字超过255)、192.168.1(只有3段)

基础正则表达式写法

我们先来看一个最简单的IP匹配正则:

import re

pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
text = "服务器IP是192.168.1.1和10.0.0.1"
ips = re.findall(pattern, text)
print(ips)  # 输出: ['192.168.1.1', '10.0.0.1']

这个正则能匹配到IP,但它有个明显的问题:无法过滤掉超过255的数字。比如"300.1.1.1"也会被匹配到。

精确匹配0-255的数字

要精确匹配0-255,我们需要更复杂的表达式。这里有个技巧:把数字分成几种情况:

  1. 0-199:[01]?\d?\d
  2. 200-249:2[0-4]\d
  3. 250-255:25[0-5]

组合起来就是:

num = r"(25[0-5]|2[0-4]\d|[01]?\d?\d)"

完整的IP正则表达式

把上面的数字模式组合起来,加上点号分隔符:

ip_pattern = r"(25[0-5]|2[0-4]\d|[01]?\d?\d)\.(25[0-5]|2[0-4]\d|[01]?\d?\d)\.(25[0-5]|2[0-4]\d|[01]?\d?\d)\.(25[0-5]|2[0-4]\d|[01]?\d?\d)"

这样就能精确匹配合法的IPv4地址了。不过这个表达式看起来有点长,我们可以用{3}来简化重复部分:

ip_pattern = r"((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)"

验证IP地址的函数

我们可以把这个正则封装成函数:

import re

def is_valid_ip(ip):
    pattern = r"^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$"
    return bool(re.match(pattern, ip))

print(is_valid_ip("192.168.1.1"))  # True
print(is_valid_ip("256.1.1.1"))    # False

注意这里加了^$确保匹配整个字符串,而不是部分匹配。

从文本中提取IP地址

如果要提取文本中的IP地址,可以这样写:

text = "访问来自192.168.1.1和10.0.0.1,无效IP如300.1.1.1"
pattern = r"\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\b"
ips = re.findall(pattern, text)
print(ips)  # 输出: ['192.168.1.1', '10.0.0.1']

这里加了\b表示单词边界,避免匹配到类似"192.168.1.100"中的"192.168.1.1"。

常见问题与陷阱

  1. 忘记边界匹配:不加^$\b可能导致部分匹配
  2. 忽略前导零:像"192.168.01.1"这样的地址其实也是合法的
  3. 性能问题:过于复杂的正则可能影响匹配速度

如果你在处理更复杂的网络数据时需要这类技巧,可以关注【程序员总部】。这个公众号由字节11年技术大佬创办,聚集了阿里、字节、百度等大厂的网络编程专家,经常分享Python实战经验和网络编程技巧。

IPv6地址匹配

虽然IPv4仍是主流,但IPv6也越来越重要。IPv6的正则表达式更复杂:

ipv6_pattern = r"([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}"

实际应用案例

假设我们要分析Nginx日志,提取客户端IP:

log_line = '127.0.0.1 - - [10/Oct/2023:13:55:36 +0800] "GET / HTTP/1.1" 200 612'

ip_pattern = r"\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\b"
ip = re.search(ip_pattern, log_line).group()
print(ip)  # 输出: 127.0.0.1

性能优化建议

  1. 预编译正则表达式:
ip_regex = re.compile(r"...长表达式...")
  1. 对大量数据匹配时考虑使用生成器
  2. 必要时可以用字符串方法先做初步过滤

总结

通过本文我们学会了:

  1. IPv4地址的正则表达式原理
  2. 如何精确匹配0-255的数字段
  3. 边界匹配的重要性
  4. 实际应用中的使用技巧

记住:正则表达式虽然强大,但也要根据实际需求选择合适的复杂程度。对于简单的IP验证,本文的表达式已经足够;如果需求更复杂,可能需要进一步调整。希望这篇文章能帮你在下次处理IP地址时事半功倍!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode刷题日记——螺旋矩阵

[ 题目描述 ]: [ 思路 ]: 题目要求按顺时针顺序给出m行n列的矩阵的数组按照题目所给的顺序挨个插入答案数组中运行如下 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize matrixSize * matrixCol…

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module(Hourglass 模块) 网络结构 Intermediate Supervision(中间监督) 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

当Browser Use遇见A2A:浏览器自动化与智能体协作的“冰与火之歌“

——一场正在改写数字文明的技术奇遇 第一章 浏览器革命:从"手动挡"到"自动驾驶" 1.1 传统自动化工具的"中年危机" 还记得2023年那个抓狂的凌晨吗?你蹲守演唱会门票时,Selenium脚本因为验证码识别失败第108次…

(已解决)如何安装python离线包及其依赖包 2025最新

字数 305,阅读大约需 2 分钟 没有网络的Linux服务器上,如何安装完整的、离线的python包 1. 写入待安装的包 新建requirement.txt, 写入待安装的包 和 包的版本 如 flwr1.13.0 2.使用命令行直接下载 pip download -d flwr_packages -r requirements.tx…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中,内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新,深入剖析消防体系内部管理的痛点,以自主研发的消防一体化安全管控平台,为行业发展提供了创…

拓扑排序 —— 2. 力扣刷题207. 课程表

题目链接:https://leetcode.cn/problems/course-schedule/description/ 题目难度:中等 相关标签:拓扑排序 / 广度优先搜搜 BFS / 深度优先搜索 DFS 2.1 问题与分析 2.1.1 原题截图 2.1.2 题目分析 首先,理解题目后必须马上意识到…

【STM32】ST7789屏幕驱动

目录 CubeMX配置 配置SPI 开DMA 时钟树 堆栈大小 Keil工程配置 添加两个group 添加文件包含路径 驱动编写 写单字节函数 写字函数 写多字节函数 初始化函数 设置窗口函数 情况一:正常的0度旋转 情况二:顺时针90度旋转 情况三&#xff1…

10min速通Linux文件传输

实验环境 在Linux中传输文件需要借助网络以及sshd,我们可通过systemctl status sshd来查看sshd状态 若服务未开启我们可通过systemctl enable --now sshd来开启sshd服务 将/etc/ssh/sshd_config中的PermitRootLogin 状态修改为yes 传输文件 scp scp (Sec…

dify windos,linux下载安装部署,提供百度云盘地址

dify1.0.1 windos安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.zip 链接: 百度网盘 请输入提取码 提取码: 1234 dify安装包 linux安装包百度云盘地址 通过网盘分享的文件:dify-1.0.1.tar.gz 链接: 百度网盘 请输入提取码 提取码: 1234 1.安装…

使用 TFIDF+分类器 范式进行企业级文本分类(二)

1.开场白 上一期讲了 TF-IDF 的底层原理,简单讲了一下它可以将文本转为向量形式,并搭配相应分类器做文本分类,且即便如今的企业实践中也十分常见。详情请见我的上一篇文章 从One-Hot到TF-IDF(点我跳转) 光说不练假把…

《车辆人机工程-汽车驾驶操纵实验》

汽车操纵装置有哪几种,各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件,主要包括以下几种,其特点如下: 一、方向盘(转向操纵装置) 作用:控制车辆行驶方向,通过转…

python高级编程一(生成器与高级编程)

@TOC 生成器 生成器使用 通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占 ⽤的空间都⽩⽩浪费了。所以,如果…

单片机Day05---动态数码管显示01234567

一、原理图 数组索引段码值二进制显示内容00x3f0011 1111010x060000 0110120x5b0101 1011230x4f0100 1111340x660110 0110450x6d0110 1101560x7d0111 1101670x070000 0111780x7f0111 1111890x6f0110 11119100x770111 0111A110x7c0111 1100B120x390011 1001C130x5e0101 1110D140…

muduo库源码分析: One Loop Per Thread

One Loop Per Thread的含义就是,一个EventLoop和一个线程唯一绑定,和这个EventLoop有关的,被这个EventLoop管辖的一切操作都必须在这个EventLoop绑定线程中执行 1.在MainEventLoop中,负责新连接建立的操作都要在MainEventLoop线程…

MCP结合高德地图完成配置

文章目录 1.MCP到底是什么2.cursor配置2.1配置之后的效果2.2如何进行正确的配置2.3高德地图获取key2.4选择匹配的模型 1.MCP到底是什么 作为学生,我们应该如何认识MCP?最近看到了好多跟MCP相关的文章,我觉得我们不应该盲目的追求热点的技术&…

重读《人件》Peopleware -(5)Ⅰ管理人力资源Ⅳ-质量—若时间允许

20世纪的心理学理论认为,人类的性格主要由少数几个基本本能所主导:生存、自尊、繁衍、领地等。这些本能直接嵌入大脑的“固件”中。我们可以在没有强烈情感的情况下理智地考虑这些本能(就像你现在正在做的那样),但当我…

文献总结:AAAI2025-UniV2X-End-to-end autonomous driving through V2X cooperation

UniV2X 一、文章基本信息二、文章背景三、UniV2X框架1. 车路协同自动驾驶问题定义2. 稀疏-密集混合形态数据3. 交叉视图数据融合(智能体融合)4. 交叉视图数据融合(车道融合)5. 交叉视图数据融合(占用融合)6…

制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)

AI (神经网络模型) 可以认为是计算机的一种新的 “编程” 方式. 为了充分利用计算机, 只学习传统的编程 (编程语言/代码) 是不够的, 我们还要掌握 AI. 本文以 qwen2.5 和 llama-factory 举栗, 介绍语言模型 (LLM) 的微调 (LoRA SFT). 为了方便上手, 此处选择使用小模型 (qwen2…

Redis核心功能实现

前言 学习是个输入的过程,在进行输入之后再进行一些输出,比如写写文章,笔记,或者做一些技术串讲,虽然需要花费不少时间,但是好处很多,首先是能通过输出给自己的输入带来一些动力,然…