【PHP小課堂】PHP中PRGE正則函數的學習

PHP中PRGE正則函數的學習

正則表達式的作用想必不用我多說了,大家在日常的開發中或多或少都會接觸到。特別是對于一些登錄(郵箱、手機號)以及網頁爬蟲來說,正則表達式就是神器一般的存在。在 PHP 中,有兩種處理正則表達式的函數,今天我們就來學習其中的一種。

PCRE 與 POSIX

前面說到,有兩種處理正則的函數庫,一個是 POSIX 為主的 ereg_xxx 這種函數,不過它們已經被淘汰了,并不是很推薦使用。而另一種就是基于 PCRE 的以 preg_xxx 開頭的這種函數庫。今天我們主要學習的就是這類型的正則處理函數庫。

POSIX 類型的正則函數庫不是二進制安全的,并且對 utf8 的支持也不好,所以從 PHP5.3 開始如果使用 ereg_xxx 這類的函數就會報一個 E_DEPRECATED 錯誤。PCRE 的函數庫對 perl 支持非常友好,同時,它也是支持 POSIX 擴展語法的正則表達式。具體的正則語法規則和模式修飾符相關的信息可以在文末的鏈接中查閱。關于模式修飾符的作用這里就不多說了,不清楚的小伙伴自己查找相關的資料哦。

另外,PCRE 與 POSIX 和 perl 也是有一些不同的,這些內容也都在文末的官方文檔鏈接中可以看到。

正則匹配

好了,話不多說,我們直接進入主題,其實大部分內容相信不少同學都是接觸過的,我們就來一一演示學習一下。

$str?=?"a@qq.com,b@sina.COM,c@yahoo.com,一堆測試數據。Test?Txt.";preg_match_all("/(.*)@(.*)\.(.*),/iU",?$str,?$out);
print_r($out);
//?Array
//?(
//?????[0]?=>?Array
//?????????(
//?????????????[0]?=>?a@qq.com,
//?????????????[1]?=>?b@sina.com,
//?????????????[2]?=>?c@yahoo.com,
//?????????)//?????[1]?=>?Array
//?????????(
//?????????????[0]?=>?a
//?????????????[1]?=>?b
//?????????????[2]?=>?c
//?????????)//?????[2]?=>?Array
//?????????(
//?????????????[0]?=>?qq
//?????????????[1]?=>?sina
//?????????????[2]?=>?yahoo
//?????????)//?????[3]?=>?Array
//?????????(
//?????????????[0]?=>?com
//?????????????[1]?=>?com
//?????????????[2]?=>?com
//?????????)//?)preg_match_all("/(.*)@(.*)\.(.*),/iU",?$str,?$out,?PREG_SET_ORDER);
print_r($out);
//?Array
//?(
//?????[0]?=>?Array
//?????????(
//?????????????[0]?=>?a@qq.com,
//?????????????[1]?=>?a
//?????????????[2]?=>?qq
//?????????????[3]?=>?com
//?????????)//?????[1]?=>?Array
//?????????(
//?????????????[0]?=>?b@sina.COM,
//?????????????[1]?=>?b
//?????????????[2]?=>?sina
//?????????????[3]?=>?COM
//?????????)//?????[2]?=>?Array
//?????????(
//?????????????[0]?=>?c@yahoo.com,
//?????????????[1]?=>?c
//?????????????[2]?=>?yahoo
//?????????????[3]?=>?com
//?????????)//?)preg_match_all("/(.*)@(.*)\.(.*),/iU",?$str,?$out,?PREG_OFFSET_CAPTURE);
print_r($out);
//?Array
//?(
//?????[0]?=>?Array
//?????????(
//?????????????[0]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?a@qq.com,
//?????????????????????[1]?=>?0
//?????????????????)//?????????????[1]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?b@sina.COM,
//?????????????????????[1]?=>?9
//?????????????????)//?????????????[2]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?c@yahoo.com,
//?????????????????????[1]?=>?20
//?????????????????)//?????????)//?????[1]?=>?Array
//?????????(
//?????????????[0]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?a
//?????????????????????[1]?=>?0
//?????????????????)//?????????????[1]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?b
//?????????????????????[1]?=>?9
//?????????????????)//?????????????[2]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?c
//?????????????????????[1]?=>?20
//?????????????????)//?????????)//?????[2]?=>?Array
//?????????(
//?????????????[0]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?qq
//?????????????????????[1]?=>?2
//?????????????????)//?????????????[1]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?sina
//?????????????????????[1]?=>?11
//?????????????????)//?????????????[2]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?yahoo
//?????????????????????[1]?=>?22
//?????????????????)//?????????)//?????[3]?=>?Array
//?????????(
//?????????????[0]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?com
//?????????????????????[1]?=>?5
//?????????????????)//?????????????[1]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?COM
//?????????????????????[1]?=>?16
//?????????????????)//?????????????[2]?=>?Array
//?????????????????(
//?????????????????????[0]?=>?com
//?????????????????????[1]?=>?28
//?????????????????)//?????????)//?)

preg_match_all() 函數用于完全的匹配,也就是文本中的內容全都匹配出來,并且將結果放到一個引用數組中。注意它最后的那個可選參數,默認情況下,數組的 0 下標是所有匹配到的字符內容,而剩下的索引內容是括號內部匹配的結果,可以對應到后面我們學習的替換函數中的 $1$2 這些插值中。

如果將最后一個參數設置為 PREG_SET_ORDER ,那么數據會以分組的形式展示,一級數組中就是每一個匹配到的內容,二級數組的 0 下標就是這個完全的文本內容,而后面的數據就是對應于這個完全匹配內容的括號內部匹配數據。

設置為 PREG_OFFSET_CAPTURE 的話,在格式上其實和默認情況下是一樣的,只是每個數組內部又多了一個表示匹配位置的數字下標值。

說實話,這三個屬性原來還真的沒有了解過,很多時候需要這些功能的時候反而是自己又重新去寫算法進行操作,這下也算是開了眼界。

preg_match("/(.*)@(.*)\.(.*),/iU",?$str,?$out);
print_r($out);
//?Array
//?(
//?????[0]?=>?a@qq.com,
//?????[1]?=>?a
//?????[2]?=>?qq
//?????[3]?=>?com
//?)preg_match("/(.*)@(.*)\.(.*),/iU",?$str,?$out,?PREG_OFFSET_CAPTURE,?2);
print_r($out);
//?Array
//?(
//?????[0]?=>?Array
//?????????(
//?????????????[0]?=>?qq.com,b@sina.COM,
//?????????????[1]?=>?2
//?????????)//?????[1]?=>?Array
//?????????(
//?????????????[0]?=>?qq.com,b
//?????????????[1]?=>?2
//?????????)//?????[2]?=>?Array
//?????????(
//?????????????[0]?=>?sina
//?????????????[1]?=>?11
//?????????)//?????[3]?=>?Array
//?????????(
//?????????????[0]?=>?COM
//?????????????[1]?=>?16
//?????????)//?)

preg_match() 函數就比較簡單了,它只返回第一個與正則相匹配的數據。當然,它也有一些可選的參數。最后一個可選參數的作用就是偏移量,我們從第 2 個字符以后開始匹配,這里匹配到的數據和第一條中的就不一樣了。

字符串分割

就像 explode() 和 str_split() 函數一樣,正則中也有將字符串分割為數組的函數,它一般會作用于更復雜的分割條件。

print_r(preg_split("/@(.*)\.(.*),/iU",?$str));
//?Array
//?(
//?????[0]?=>?a
//?????[1]?=>?b
//?????[2]?=>?c
//?????[3]?=>?一堆測試數據。Test?Txt.
//?)print_r(preg_split("/@(.*)\.(.*),/iU",?$str,?2,?PREG_SPLIT_OFFSET_CAPTURE));
//?Array
//?(
//?????[0]?=>?Array
//?????????(
//?????????????[0]?=>?a
//?????????????[1]?=>?0
//?????????)//?????[1]?=>?Array
//?????????(
//?????????????[0]?=>?b@sina.COM,c@yahoo.com,一堆測試數據。Test?Txt.
//?????????????[1]?=>?9
//?????????)//?)

這里我們是通過 @xxx.xxx, 來作為分隔符,所以分隔后的結果就是不包含這個分隔符的數組數據。preg_split() 這個函數的默認使用也是比較簡單的,它同樣有一些可選參數,比如第二條,第三個可選參數的作用是限制分割的數量,這里我們限制只分割成兩個數組,所以文本后面的內容都會放到一個數組中,并且通過最后一個參數來指定返回查找到的數據的位置在字符串中的下標。

正則替換

關于替換的內容就比較多了,可以說,除了第一個我們介紹的 preg_match_all() 之外,最常用的就是 preg_replace() 這個函數了。它的作用當然也是和 str_replace() 類似的,只不過使用正則的話條件能夠更豐富,也更加強大。

普通替換

echo?preg_replace("/@(.*)\.(.*),/iU",?'@$1.$2.cn,?',$str),?PHP_EOL;
//?a@qq.com.cn,?b@sina.COM.cn,?c@yahoo.com.cn,?一堆測試數據。Test?Txt.echo?preg_replace("/[\x{4E00}-\x{9FFF}]+/u",?'Many?Test?Info.',$str,?-1,?$count),?PHP_EOL;
echo?$count,?PHP_EOL;
//?a@qq.com,b@sina.COM,c@yahoo.com,Many?Test?Info.。Test?Txt.
//?3echo?preg_replace("/@(.*)\.(.*),/iU",?'@$1.$2.cn,?',$str,?2,?$count),?PHP_EOL;
echo?$count,?PHP_EOL;
//?a@qq.com.cn,?b@sina.COM.cn,?c@yahoo.com,一堆測試數據。Test?Txt.
//?2

普通的 preg_replace() 函數也是非常簡單的,它的可選參數其實和 str_replace() 也是類似的,第 4 個參數指定替換數量,比如第二條設置為 -1 也就是默認值,這樣就是全部替換,而第三條就是設置為 2 ,只會替換兩條匹配的內容。最后一個參數是返回匹配替換的數量,它是一個引用參數,也就是文本中我們一共替換掉了多少內容,或者說是我們匹配到了多少條信息。

另外還有一個函數和 preg_replace() 非常類似。我們直接來看它和 preg_replace() 的區別。

echo?preg_filter("/@(.*)\.(.*),/iU",?'@$1.$2.cn,?',$subStr),?PHP_EOL;$subject?=?array('1',?'a',?'2',?'b',?'3',?'A',?'B',?'4');?
$pattern?=?array('/\d/',?'/[a-z]/',?'/[1a]/');?
$replace?=?array('A:$0',?'B:$0',?'C:$0');?echo?"preg_filter?的結果:",?PHP_EOL;
print_r(preg_filter($pattern,?$replace,?$subject));?
//?preg_filter?的結果:
//?Array
//?(
//?????[0]?=>?A:C:1
//?????[1]?=>?B:C:a
//?????[2]?=>?A:2
//?????[3]?=>?B:b
//?????[4]?=>?A:3
//?????[7]?=>?A:4
//?)echo?"preg_replace?的結果:",?PHP_EOL;
print_r(preg_replace($pattern,?$replace,?$subject));
//?preg_replace?的結果:
//?Array
//?(
//?????[0]?=>?A:C:1
//?????[1]?=>?B:C:a
//?????[2]?=>?A:2
//?????[3]?=>?B:b
//?????[4]?=>?A:3
//?????[5]?=>?A
//?????[6]?=>?B
//?????[7]?=>?A:4
//?)

從上面的代碼中可以看出,preg_filter() 函數最后返回的結果會是匹配到結果的內容,而 preg_replace() 如果字符中沒有匹配到結果,也會返回原始的內容。它們兩個的參數是完全相同的。

在這段測試代碼中,我們使用了數組作為替換的前三個參數,它們的匹配規則是 pattern 對應 replace 的一個一個去匹配。也就是說,0 號下標的 /\d/ 對應的匹配規則是 A:$0 ,如果缺少了替換或者匹配規則的話,不會報錯,但替換的結果可能就不是你想要的了。

注意,只有替換類的函數是可以這樣接收數組作為參數的。

回調替換

除了上面的替換之外,PRGE 的函數庫中還有回調式替換的函數,也就是能讓我們自定義替換之后的返回結果。

print_r(preg_replace_callback($pattern,?function($matches){print_r($matches);return?strtolower($matches[0]);
},?$subject));
//?Array
//?(
//?????[0]?=>?1
//?)
//?Array
//?(
//?????[0]?=>?1
//?)
//?Array
//?(
//?????[0]?=>?a
//?)
//?Array
//?(
//?????[0]?=>?a
//?)
//?Array
//?(
//?????[0]?=>?2
//?)
//?Array
//?(
//?????[0]?=>?b
//?)
//?Array
//?(
//?????[0]?=>?3
//?)
//?Array
//?(
//?????[0]?=>?4
//?)
//?Array
//?(
//?????[0]?=>?1
//?????[1]?=>?a
//?????[2]?=>?2
//?????[3]?=>?b
//?????[4]?=>?3
//?????[5]?=>?A
//?????[6]?=>?B
//?????[7]?=>?4
//?)print_r(preg_replace_callback('/(.*)@(.*)\.(.*),/iU',?function($matches){return?strtoupper($matches[0]);
},?$str));
//?A@QQ.COM,B@SINA.COM,C@YAHOO.COM,一堆測試數據。Test?Txt.

preg_replace_callback() 的第二個參數其實就是相當于把 preg_replace() 中的替換字符串換成一個匿名回調函數了。這個函數中的參數就是匹配到的結果,上面的測試代碼中我們全部打印了出來。然后給這個函數一個 return 返回值,就是對應地去把替換的結果返回到原值中。

preg_replace_callback() 最終的返回值是根據傳遞給它的原始數據來確定的,如果是數組就返回數組,如果是字符串就返回的字符串。

另外還有一種更復雜的回調函數。

print_r(preg_replace_callback_array(['/(.*)@(.*)\.(.*),/iU'?=>?function?($matches)?{echo?'one:',?$matches[0],?PHP_EOL;return?strtoupper($matches[0]);},'/Test?Txt./iU'?=>?function?($matches)?{echo?'two:',?$matches[0],?PHP_EOL;return?strtoupper($matches[0]);}],$str
));
//?one:a@qq.com,
//?one:b@sina.COM,
//?one:c@yahoo.com,
//?two:Test?Txt.
//?A@QQ.COM,B@SINA.COM,C@YAHOO.COM,一堆測試數據。TEST?TXT.

沒錯,在一個函數中進行兩種正則模式的匹配。是不是感覺很高大上。這個函數的使用場景就不多了,而且需要注意的是,如果第一條正則匹配到數據了,第二條正則就不會有匹配的結果了,這個大家可以自己測試一下。

匹配驗證及字符串模式格式轉換

匹配驗證就是驗證我們的正則表達式是否能匹配到的內容。

print_r(preg_grep("/\d/",?[$str]));
//?Array
//?(
//?)print_r(preg_grep("/\d/",?[$str],?PREG_GREP_INVERT));
//?Array
//?(
//?????[0]?=>?a@qq.com,b@sina.COM,c@yahoo.com,一堆測試數據。Test?Txt.
//?)

它只返回能夠匹配到的數據,也就是第二個參數。這個參數必須是一個數組,可以驗證多條數據是否能夠通過這個正則匹配到內容,但不返回具體的匹配內容信息。可以用作在正式的 preg_match_all() 或者替換、分割操作之前的判斷驗證。它的最后一個參數如果設置為 PREG_GREP_INVERT 的話,就是反向地獲取不能和正則匹配的數據。

print_r(preg_quote("(.*).(.*),"));
//?\(\.\*\)\.\(\.\*\),

preg_quote() 函數其實是有點類似于 addslashes() 函數,它是針對正則中的特殊符號添加轉義斜杠的。

錯誤信息

最后我們再看看錯誤信息的展示,對于正則匹配的錯誤,在 PHP8 之前僅有一個錯誤號,作用不大。

preg_match("///",?$str);print_r(preg_last_error());?
//?Warning:?preg_match():?Delimiter?must?not?be?alphanumeric?or?backslash?in?/Users/zhangyue/MyDoc/博客文章/dev-blog/php/2021/03/source/6.PHP中PRGE正則函數的學習.php?on?line?332
//?1
//?print_r(preg_last_error_msg());??//?php8

而在 PHP8 之后,新增加了一個 preg_last_error_msg() 可以返回錯誤信息。不過我的電腦上還沒有安裝 PHP8 所以這塊內容就不展示了。

總結

PHP 中正則操作的函數就這些,但正則真正的精髓其實是在于正則表達式怎么寫這一塊。不好的正則可能會產生嚴重的回溯導致性能的急劇下降,所以在做業務開發的時候,能不用正則其實還是盡量不要用的。不過相對來說,像是登錄的用戶驗證之類的功能,正則簡直不要太好用,這個就完全可以讓正則好好發揮啦!另外,用好模式修飾符也是能夠有效地提升正則效率的,這些都是值得我們深入去研究的東西,有興趣的小伙伴多多閱讀官方文檔,一定能找到讓你驚喜的地方。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/03/source/6.PHP%E4%B8%ADPRGE%E6%AD%A3%E5%88%99%E5%87%BD%E6%95%B0%E7%9A%84%E5%AD%A6%E4%B9%A0.php

參考文檔:

https://www.php.net/manual/zh/book.pcre.php

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35890.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35890.shtml

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

相關文章

ChatGPT在用戶交互過程中如何實現自我學習和優化?

ChatGPT的自我學習和優化:深度解析與未來展望 在人工智能領域,ChatGPT的出現標志著自然語言處理技術的一大飛躍。作為一個先進的語言模型,ChatGPT不僅能夠與用戶進行流暢的對話,還能夠通過自我學習和優化來不斷提升其性能。本文將…

【SkiaSharp繪圖11】SKCanvas屬性詳解

文章目錄 SKCanvas構造SKCanvas構造光柵 Surface構造GPU Surface構造PDF文檔構造XPS文檔構造SVG文檔SKNoDrawCanvas 變換剪裁和狀態構造函數相關屬性DeviceClipBounds獲取裁切邊界(設備坐標系)ClipRect修改裁切區域IsClipEmpty當前裁切區域是否為空IsClipRect裁切區域是否為矩形…

JFreeChart 生成Word圖表

文章目錄 1 思路1.1 概述1.2 支持的圖表類型1.3 特性 2 準備模板3 導入依賴4 圖表生成工具類 ChartWithChineseExample步驟 1: 準備字體文件步驟 2: 注冊字體到FontFactory步驟 3: 設置圖表具體位置的字體柱狀圖:餅圖:折線圖:完整代碼&#x…

【QT】Svg圖標

目錄 SVGQT繪制SVG流程 SVG 一般而言,QSS是無法直接使用svg圖像的。 那如何才能顯示svg呢?我們知道svg的好處有很多,如矢量圖,體積小等等 svg本來就是一個document(可參考12),QT提供了QSvgRend…

二叉樹深度優先搜索(非遞歸實現,迭代法)

目錄 為什么可以用迭代法實現二叉樹的前后中序遍歷? 前序遍歷 后序遍歷 中序遍歷 為什么可以用迭代法實現二叉樹的前后中序遍歷? 因為遞歸的實現本質是,每次遞歸調用都會把函數的局部變量、參數值和返回地址等壓入調用棧中,然…

web期末作業設計網頁

設計一個網頁作為期末作業是一個很好的機會來展示你的前端開發技能。以下是一些步驟和建議,幫助你完成這個項目: 1. 確定網頁主題和目的 決定你的網頁是關于什么的(例如:個人博客、在線商店、公司網站、信息發布平臺等&#xff…

國產車規MCU OTA方案總結

目錄 1. 旗芯微FC4150 OTA 2. 云途YTM32B1MD OTA 3.小結 今天沒有廢話,啪一下很快,把目前接觸到的國內帶eFlash的車規MCU硬件OTA方案做一個梳理。 1. 旗芯微FC4150 OTA 旗芯微FC4150是基于ARM Cortex(快去審核下官網介紹,少了個T)-M4F內…

入門者必看-Ansible:自動化運維的利器

1. 引言 在當今快速變化的IT環境中,自動化成為了提升工作效率和確保系統一致性的重要手段。Ansible作為一個開源的自動化工具,因其簡單易用、功能強大而廣受歡迎。本文將深入探討Ansible的概念、架構、體系結構、搭建過程、常用操作方式以及使用場景&…

openGauss Developer Day 2024丨MogDB實現數據庫技術跨越,Ustore引擎革新存儲新境界

openGauss Developer Day 2024 6月21日,openGauss Developer Day 2024在北京昆泰嘉瑞文化中心成功召開。大會聚集學術專家、行業用戶、合作伙伴和開發者,共同探討數據庫面向多場景的技術創新,分享基于 openGauss 的行業聯合創新成果及實踐案例…

探索PHP中的魔術常量

PHP中的魔術常量(Magic Constants)是一些特殊的預定義常量,它們在不同的上下文中具有不同的值。這些常量可以幫助開發者獲取文件路徑、行號、函數名等信息,從而方便調試和日志記錄。本文將詳細介紹PHP中的魔術常量,幫助…

web前端——javaScript

目錄 一、javaScript概述 1.javaScript歷史 2.JavaScript與html,css關系 二、基本語法 ①放在head中 ②放在 body中 ③寫在外部的.js文件中 1.變量 2.數據類型 3.算術運算符 4.邏輯運算符 5.賦值運算 6.邏輯運算符 7.條件運算符 8.控制語句 三、函數 1…

智能掃地機器人環境感知與地圖構建優化方案

以下是一個針對智能掃地機器人程序中環境感知與地圖構建問題的具體解決方案,參考了之前文章中的相關技術和信息: 智能掃地機器人環境感知與地圖構建優化方案 一、引入高精度傳感器 激光雷達(LiDAR):使用高精度激光雷達…

模板語法輪播

1.常用的視圖容器組件 view類似于div進行使用 <div></div><view></view> scroll-view實現滾動列表效果 <scroll-view scroll-y> <view></view> <view></view> <view></view> </scroll-view> …

數據庫死鎖解決

一、Oracle死鎖查看和解決辦法匯總 由于生產的tomcat 經常有假死問題&#xff0c;困擾很久&#xff0c;最后發現有死鎖&#xff0c;解決辦法分享 1.1、查看死鎖 1.1.1、用dba用戶執行以下語句 select username,lockwait,status,machine,program from v$session where sid in …

Arduino - 按鈕 - 長按短按

Arduino - Button - Long Press Short Press Arduino - 按鈕 - 長按短按 Arduino - Button - Long Press Short Press We will learn: 我們將學習&#xff1a; How to detect the button’s short press 如何檢測按鈕的短按How to detect the button’s long press 如何檢測…

重大進展!微信支付收款碼全場景接入銀聯網絡

據中國銀聯6月19日消息&#xff0c;近日&#xff0c;銀聯網絡迎來微信支付收款碼場景的全面接入&#xff0c;推動條碼支付互聯互通取得新進展&#xff0c;為境內外廣大消費者提供更多支付選擇、更好支付體驗。 2024年6月&#xff0c;伴隨微信支付經營收款碼的開放&#xff0c;微…

Docker部署Nginx+Keepalived

# 創建掛載路徑 mkdir /data/nginx_keep/nginx/conf -p mkdir /data/nginx_keep/keepalived/vim nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {incl…

Rust: duckdb和polars讀csv文件比較

一、文件準備 樣本內容&#xff0c;N行9列的csv標準格式&#xff0c;有字符串&#xff0c;有浮點數&#xff0c;有整型。 有兩個csv文件&#xff0c;一個大約是2.1萬行&#xff1b;一個是64萬行。 二、toml文件 [package] name "my_duckdb" version "0.1.0&…

opencv簡單小項目

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;它提供了大量的圖像和視頻處理功能。使用OpenCV可以開發各種簡單的小項目&#xff0c;例如&#xff1a; 圖像基本操作&#xff1a; 讀取和顯示圖像。調整…

弱監督學習

弱監督學習&#xff08;Weak Supervision&#xff09;是一種利用不完全、不精確或噪聲數據進行模型訓練的方法。以下是一些常用的弱監督方法及其原理&#xff1a; 1. 數據增強&#xff08;Data Augmentation&#xff09; 原理&#xff1a; 數據增強是一種通過增加訓練數據的多…