Python中如何用正則表達式精準匹配IP地址?

在網絡編程和數據處理時,我們經常需要從文本中提取或驗證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 repattern = 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 redef 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.pswp.cn/bicheng/76687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76687.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring--聲明式事務

聲明式事務 1、回顧事務 要么都成功,要么都失敗! 事務在項目開發中,十分重要,涉及數據的一致性問題 確保完整性和一致性 事務ACID: 原子性:事務是原子性操作,由一系列動作組成,…

Kotlin 學習-集合

/*** kotlin 集合* List:是一個有序列表,可通過索引(下標)訪問元素。元素可以在list中出現多次、元素可重復* Set:是元素唯一的集合。一般來說 set中的元素順序并不重要、無序集合* Map:(字典)是一組鍵值對。鍵是唯一的…

WPF 五子棋項目文檔

WPF 五子棋項目文檔 1. 項目概述 本項目是一個使用 Windows Presentation Foundation (WPF) 技術棧和 C# 語言實現的桌面版五子棋(Gomoku)游戲。它遵循 MVVM(Model-View-ViewModel)設計模式,旨在提供一個結構清晰、可…

計算機操作系統——死鎖(詳細解釋和處理死鎖)

系列文章目錄 計算機操作系統-計算機系統中的死鎖 文章目錄 系列文章目錄前言一、資源問題: 計算機系統當中的死鎖: 二、死鎖的定義、必要條件和處理方法: 1.死鎖的定義:2.產生死鎖的必要條件:3.處理死鎖的方法&#…

Springboot項目正常啟動,訪問資源卻出現404錯誤如何解決?

我在自己的springboot項目中的啟動類上同時使用了SprinBootApplication和ComponentScan注解, 雖然項目能夠正常啟動,但是訪問資源后,返回404錯誤,隨后在啟動類中輸出bean,發現controller創建失敗: 而后我將ComponentScan去掉后資源就能訪問到了. 原因 SprinBootApplication本身…

第十五屆藍橋杯C/C++B組省賽真題講解(分享去年比賽的一些真實感受)

試題A——握手問題 一、解題思路 直接用高中學的排列組合思路 二、代碼示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

動態規劃(6)——01背包問題

歡迎來到博主的專欄&#xff1a;算法解析 博主ID&#xff1a;代碼小號 文章目錄 牛客網——【模板】01背包題目解析題目1算法原理題目1題解代碼。問題2算法原理問題2題解代碼01背包問題的滾動數組優化 牛客網——【模板】01背包 題目解析 關于I/O相關的東西博主就不多贅述了&a…

TQTT_KU5P開發板教程---實現流水燈

文檔實現功能介紹 本文檔是學習本開發板的基礎&#xff0c;通過設置計數器使led0到led7依次閃爍&#xff0c;讓用戶初步認識vivado基本的開發流程以及熟悉項目的創建。本開發板的所有教程所使用的軟件都是vivado2024.1版本的。可以根據網上的教程下載與安裝。 硬件資源 此次教程…

Spring 中的 @Cacheable 緩存注解

1 什么是緩存 第一個問題&#xff0c;首先要搞明白什么是緩存&#xff0c;緩存的意義是什么。 對于普通業務&#xff0c;如果要查詢一個數據&#xff0c;一般直接select數據庫進行查找。但是在高流量的情況下&#xff0c;直接查找數據庫就會成為性能的瓶頸。因為數據庫查找的…

SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration

一、動機 如何從檢索到的段落中提取證據&#xff0c;以降低計算成本并提升最終的RAG性能&#xff0c;然而這一問題仍然具有挑戰性。 現有方法 嚴重依賴于基于啟發式的增強&#xff0c;面臨以下幾個問題&#xff1a; &#xff08;1&#xff09;由于手工制作的上下文過濾&…

毫米波測試套裝速遞!高效賦能5G/6G、新材料及智能超表面(RIS)研發

德思特&#xff08;Tesight&#xff09;作為全球領先的測試測量解決方案提供商&#xff0c;始終致力于為前沿技術研發提供高精度、高效率的測試工具。 針對毫米波技術在高頻通信、智能超表面&#xff08;RIS&#xff09;、新材料等領域的快速應用需求&#xff0c;我們推出毫米…

三維激光測量助力企業檢測效率提升3倍

智能制造與數字化浪潮席卷下&#xff0c;三維掃描技術已成為工業檢測領域不可或缺的工具。面對傳統檢測手段的精度瓶頸與效率局限&#xff0c;三維掃描儀&#xff0c;以毫米級精度、非接觸式測量與超高速掃描三大核心優勢&#xff0c;為汽車制造、航空航天、消費電子等行業的品…

SQL:Normalization(范式化)

目錄 Normalization&#xff08;范式化&#xff09; 為什么需要 Normalization&#xff1f; &#x1f9e9; 表格分析&#xff1a; 第一范式&#xff08;1NF&#xff09; 什么是第一范式&#xff08;First Normal Form&#xff09;&#xff1f; 第二范式&#xff08;2NF&am…

#MES系統運維問題分析思路

一套適用于90% MES運維現場問題的排查分析思維模型&#xff0c;叫做&#xff1a; &#x1f50d; MES系統問題分析七步法&#xff08;現場實戰適用&#xff09; ? 第一步&#xff1a;明確問題現象&#xff08;What&#xff09; 問題要說清楚&#xff0c;“不能操作”這種模糊描…

達夢數據庫-學習-18-ODBC數據源配置(Linux)

一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentOS Linux release 7.9.2009 (Core)內存4G邏輯核數2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…

js 效果展示 拿去練手

自學完整功能&#xff0c;拿去練手。 鼠標移動放大 通過網盤分享的文件&#xff1a;圖片放大 鏈接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取碼: 95p6 通過網盤分享的文件&#xff1a;圖片動畫效果 鏈接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…

使用 TFIDF+分類器 范式進行企業級文本分類(二)

1.開場白 上一期講了 TF-IDF 的底層原理&#xff0c;簡單講了一下它可以將文本轉為向量形式&#xff0c;并搭配相應分類器做文本分類&#xff0c;且即便如今的企業實踐中也十分常見。詳情請見我的上一篇文章 從One-Hot到TF-IDF&#xff08;點我跳轉&#xff09; 光說不練假把…

硬件設計-MOS管快速關斷的原因和原理

目錄 簡介&#xff1a; 來源&#xff1a; MOS管快關的原理 先簡單介紹下快關的原理&#xff1a; 同電阻時為什么關斷時間會更長 小結 簡介&#xff1a; 本章主要介紹MOS快速關斷的原理和原因。 來源&#xff1a; 有人會問&#xff0c;會什么要求快速關斷&#xff0c;而…

Linux進階命令

目錄 一、touch 1. 基本語法 2. 常用選項 二、which 1. 基本語法 2. 主要功能 3. 常用選項 三、find 1. 基本語法 2. 常用選項和表達式 四、more 1. 基本語法 2. 常用操作 3. 對比 more 和 less 五、grep 1. 基本語法 2. 常用選項 六、wc 1. 基本語法 2. 常…

阿里云實時計算Flink版產品體驗測評

阿里云實時計算Flink版產品體驗測評 什么是阿里云實時計算Flink應用場景實時計算Flink&自建Flink集群性價比開發效率運維管理企業安全 場景落地 什么是阿里云實時計算Flink 實時計算Flink大家可能并不陌生&#xff0c;在實時數據處理上&#xff0c;可能會有所接觸&#xf…