《Python偵探手冊:用正則表達式破譯文本密碼》

在這個信息爆炸的時代,每個人都需要一本偵探手冊。阿佑今天將帶你深入Python的正則表達式世界,教你如何像偵探一樣,用代碼破解文本中的每一個謎題。從基礎的字符匹配到復雜的數據清洗,每一個技巧都足以讓你在文本處理的領域中成為高手!

文章目錄

    • 1. 引言
      • 正則表達式的概念與重要性
      • Python中正則表達式的應用領域
    • 2. 背景介紹
      • 2.1 正則表達式基礎
      • 2.2 Python中的正則表達式庫
    • 3. 正則表達式基礎操作
      • 3.1 字符匹配與位置錨定
      • 3.2 量詞與貪婪模式
      • 3.3 字符類與范圍
      • 示例代碼
    • 4. 組合與捕獲
      • 4.1 分組與反向引用
      • 4.2 零寬斷言
    • 5. 高級正則表達式特性
      • 5.1 替換與分割
      • 5.2 編譯選項與標志
      • 5.3 正則表達式性能優化
    • 6. 實戰應用案例
      • 6.1 文本提取與清洗
      • 6.2 驗證與格式匹配
    • 7. 結論
      • 正則表達式在Python中的威力總結
      • 持續學習與實踐的重要性
      • 持續進步的小貼士

1. 引言

大家好,歡迎來到Python進階的奇妙世界,今天阿佑要和大家聊的是正則表達式——這個聽起來有點高深莫測,實則是編程界的瑞士軍刀,功能強大到令人驚嘆。

正則表達式的概念與重要性

想象一下,你是一個偵探,手里拿著放大鏡,正在尋找線索。正則表達式就像是那個放大鏡,它幫你在茫茫數據中快速定位到你需要的信息。無論是文本匹配、數據清洗,還是格式驗證,正則表達式都能大顯身手。

Python中正則表達式的應用領域

在Python的世界里,正則表達式就像是一把萬能鑰匙,解鎖各種復雜問題的解決方案。從簡單的文本搜索替換,到復雜的數據驗證,再到高級的文本處理,正則表達式都能助你一臂之力。

舉個例子,假設你是一個社交媒體公司的數據分析員,你需要從海量的帖子中提取出所有的電子郵件地址。如果沒有正則表達式,你可能需要一行行地檢查文本,這無疑是一項耗時且枯燥的工作。但有了正則表達式,你可以用一行代碼就完成這項任務,效率提升何止百倍!

接下來,讓我們一起進入正則表達式的神奇世界,探索它的奧秘,學習如何使用它來解決問題。別擔心,我會用最接地氣、最有趣的方式帶你一步步深入了解。準備好了嗎?讓我們開始這段精彩的旅程吧!

在這里插入圖片描述

2. 背景介紹

2.1 正則表達式基礎

正則表達式,聽起來是不是有點像數學中的“正則”?其實,它和數學里的正則概念并沒有直接關系,但它確實是一種規則,用來描述、匹配字符串的一種強大工具。

歷史與基本原理

正則表達式的歷史可以追溯到20世紀50年代,由Unix操作系統的先驅者之一的Ken Thompson首次引入。它的原理基于模式匹配,通過一系列符號和特殊字符來定義搜索模式,從而實現對文本的快速檢索和處理。

常用符號與元字符意義

正則表達式由一些特殊的符號組成,每個符號都有其特定的含義。比如:

  • . 點號代表任意單個字符(除了換行符)。
  • * 星號表示前面的元素可以出現零次或多次。
  • + 加號表示前面的元素至少出現一次。
  • ? 問號表示前面的元素可以出現零次或一次。
  • [] 方括號用于定義字符集,匹配其中的任意一個字符。

這些符號就像魔法咒語,組合起來可以施展出強大的文本處理魔法。

2.2 Python中的正則表達式庫

在Python中,我們有一個專門的庫來處理正則表達式,那就是re模塊。它提供了豐富的函數來執行各種正則表達式操作。

re模塊簡介

re模塊是Python標準庫的一部分,不需要額外安裝。它包含了幾乎所有你需要的正則表達式功能,從簡單的搜索到復雜的替換和分割。

compile函數與match/search方法

  • compile函數可以將正則表達式編譯成正則表達式對象,這樣做的好處是可以提高效率,特別是當你需要多次使用同一個正則表達式時。
  • match方法用于從字符串的起始位置開始匹配正則表達式。
  • search方法則是在字符串中搜索正則表達式的第一個位置,不局限于起始位置。

舉個例子,假設你想要檢查一個字符串是否以"Hello"開頭,你可以這樣寫:

import repattern = re.compile(r'^Hello')
if pattern.match("Hello World"):print("匹配成功!")

這段代碼會輸出“匹配成功!”,因為"Hello World"確實以"Hello"開頭。

通過這些基礎的介紹,你應該對正則表達式有了初步的了解。但是,這僅僅是冰山一角。接下來,我們將深入探索正則表達式的更多高級特性和應用,準備好迎接挑戰了嗎?讓我們繼續前進!

3. 正則表達式基礎操作

3.1 字符匹配與位置錨定

想象一下,你是一名偵探,正在尋找線索。在正則表達式的世界中,每一個字符都是一個線索,而位置錨定就是告訴你這些線索可能出現的地方。

字母數字與特殊字符匹配

在正則表達式中,每個字符通常代表它自己。比如說,如果你想匹配字母"a",你只需要寫"a"。但有時候,一些字符有特殊的含義,比如.點號,它代表任意單個字符。所以,如果你想匹配一個點號,你需要用\.來表示。

^開始與$結束位置匹配

位置錨定就像是偵探的放大鏡,^表示字符串的開始,而$表示字符串的結束。這就像是告訴你線索只能在特定的地方出現。比如,如果你想匹配一個字符串,它必須以"start"開頭并以"end"結束,你可以這樣寫:^start.*end$

3.2 量詞與貪婪模式

量詞就像是偵探的放大鏡的放大倍數,它們告訴你一個元素可以出現多少次。

重復次數表示:*、+、?

  • *星號表示前面的元素可以出現零次或多次。比如說,a*可以匹配零個或多個"a"。
  • +加號表示前面的元素至少出現一次。a+可以匹配一個或多個"a"。
  • ?問號表示前面的元素可以出現零次或一次。a?可以匹配零個或一個"a"。

非貪婪匹配原則

在正則表達式中,默認情況下,量詞是貪婪的,它們會盡可能多地匹配元素。但有時候,我們希望它們盡可能少地匹配,這就是非貪婪模式。在量詞后面加上?就可以實現非貪婪匹配。比如,a*?會盡可能少地匹配"a"。

3.3 字符類與范圍

字符類和范圍就像是偵探的工具箱,它們幫助你快速找到一組特定的線索。

[]定義字符集

方括號[]可以用來定義一個字符集,匹配其中的任意一個字符。比如,[abc]可以匹配"a"、“b"或"c”。

特殊字符類:\d, \w, \s

  • \d匹配任意數字,相當于[0-9]
  • \w匹配任意字母數字字符,包括下劃線。
  • \s匹配任意空白字符,包括空格、制表符、換行符等。

范圍指定:a-z, 0-9

在方括號中,你還可以使用范圍指定,比如[a-z]匹配任意小寫字母,[0-9]匹配任意數字。

示例代碼

讓我們來看一個實際的例子,假設你是一名圖書管理員,需要找出所有以"The"開頭的書名:

import rebooks = ["The Great Gatsby", "Moby Dick", "1984", "To Kill a Mockingbird"]
pattern = re.compile(r'^The')for book in books:if pattern.match(book):print(f"找到了以'The'開頭的書名: {book}")

這段代碼會輸出:

找到了以'The'開頭的書名: The Great Gatsby

通過這個例子,你可以看到正則表達式如何幫助我們快速地從大量數據中找到我們想要的信息。這只是基礎操作,接下來我們將探索更高級的特性,準備好了嗎?讓我們繼續深入正則表達式的神秘世界!

4. 組合與捕獲

4.1 分組與反向引用

在正則表達式的世界里,分組就像是偵探的筆記本,用來記錄和引用特定的線索。

圓括號的使用

圓括號()在正則表達式中用來創建一個分組,它允許你捕獲匹配的部分,并在之后的操作中引用它。就像偵探在筆記本上畫圈圈,標記重要的線索一樣。

舉個例子,假設你要匹配一個電子郵件地址,通常電子郵件的格式是username@domain。你可以這樣寫:

import reemail_pattern = re.compile(r'(\w+)@(\w+\.\w+)')
emails = ["alice@example.com", "bob@company.org", "charlie@work.net"]for email in emails:if email_pattern.match(email):print(f"用戶名: {email_pattern.group(1)}, 域名: {email_pattern.group(2)}")

這段代碼會輸出每個電子郵件的用戶名和域名,就像偵探從線索中提取關鍵信息一樣。

組號與命名組

在圓括號中,你還可以通過組號來引用捕獲的文本。組號就是圓括號中的序號,從1開始。此外,Python的re模塊還支持命名組,你可以給分組起個名字,這樣引用起來更加直觀。

比如,我們可以給電子郵件的用戶名和域名分別命名:

email_pattern = re.compile(r'(?P<username>\w+)@(?P<domain>\w+\.\w+)')

然后,你可以通過名字來引用這些分組:

for email in emails:if email_pattern.match(email):print(f"用戶名: {email_pattern.group('username')}, 域名: {email_pattern.group('domain')}")

在這里插入圖片描述

4.2 零寬斷言

零寬斷言就像是偵探的直覺,它幫助你在不消耗字符的情況下,判斷某個位置是否符合特定的條件。

前瞻與后顧斷言

前瞻斷言(?=...)和后顧斷言(?<=...)允許你在不捕獲任何字符的情況下,檢查字符串中是否存在特定的模式。這就像是偵探在不觸碰現場的情況下,判斷某個線索是否與案件有關。

舉個例子,假設你要確保一個單詞后面跟著一個逗號,但不包括逗號本身:

import retext = "I have an apple, a banana, and a pear."# 使用前瞻斷言匹配單詞后面跟著逗號但不包括逗號
pattern = re.compile(r'\b\w+(?=,)')
matches = pattern.findall(text)print("單詞后面跟著逗號的有:", matches)

這段代碼會輸出:

單詞后面跟著逗號的有: ['an apple', 'a banana']

邊界匹配:\b, \B

邊界匹配符\b\B用來匹配單詞的邊界和非邊界。\b匹配單詞的開頭或結尾,而\B匹配任意不是單詞邊界的位置。

舉個例子,假設你要匹配所有不是獨立單詞的"and":

pattern = re.compile(r'\Band\b')
matches = pattern.findall("I have an apple, a banana, and a pear and some oranges.")print("非獨立單詞的'and'有:", matches)

這段代碼會輸出:

非獨立單詞的'and'有: ['and']

通過這些組合和捕獲技巧,你可以更精確地控制正則表達式的匹配過程,就像偵探一樣,通過細致的觀察和推理,找到隱藏在文本中的線索。準備好了嗎?我們將繼續探索正則表達式的更多高級特性,讓偵探工作變得更加高效和有趣!

5. 高級正則表達式特性

5.1 替換與分割

正則表達式的替換和分割功能,就像是你的文本編輯器里的快捷鍵,讓你在處理文本時更加得心應手。

sub與subn方法的應用

sub方法用于替換字符串中匹配正則表達式的第一個實例,而subn方法則替換所有匹配的實例,并返回替換的數量。這就像是你用橡皮擦掉錯誤的信息,然后用筆寫上正確的內容。

舉個例子,假設你是一名編輯,需要將所有"error"這個詞替換為"mistake":

import retext = "This is a typo error. Please correct the error in the sentence."
corrected_text, num_replaced = re.subn(r'\berror\b', 'mistake', text)print(f"修正后的文本: {corrected_text}")
print(f"替換了 {num_replaced} 次。")

這段代碼會輸出:

修正后的文本: This is a typo mistake. Please correct the mistake in the sentence.
替換了 2 次。

split方法的高級用法

split方法通常用于分割字符串,但當結合正則表達式使用時,它可以按照特定的模式來分割文本,而不是默認的空白字符。

舉個例子,假設你要分割一個包含多個日期的字符串,日期格式為"YYYY-MM-DD":

import redate_string = "2024-05-18, 2024-05-19, 2024-05-20"
dates = re.split(r',\s+', date_string)print("分割后的日期:", dates)

這段代碼會輸出:

分割后的日期: ['2024-05-18', '2024-05-19', '2024-05-20']

5.2 編譯選項與標志

編譯選項和標志就像是你編程時的注釋,它們告訴正則表達式引擎如何處理你的模式。

忽略大小寫、多行模式等

  • re.IGNORECASE或簡寫為re.I,讓匹配時忽略大小寫。
  • re.MULTILINE或簡寫為re.M,讓^$匹配每一行的開始和結束,而不僅僅是整個字符串。

舉個例子,假設你要在多行文本中找到所有以"start"開頭的行,不考慮大小寫:

import retext = """
start with a capital letter
start with a lowercase letter
START with an uppercase letter
"""pattern = re.compile(r'^start', re.IGNORECASE | re.MULTILINE)
matches = pattern.findall(text)print("匹配的行:", matches)

這段代碼會輸出:

匹配的行: ['start with a capital letter', 'start with a lowercase letter', 'START with an uppercase letter']

編譯時定制行為

通過編譯正則表達式,你可以設置特定的選項和標志,然后在多次匹配操作中重用這個編譯后的模式,這樣可以提高效率。

5.3 正則表達式性能優化

性能優化就像是給你的電腦升級硬件,讓你的代碼運行得更快。

預編譯與緩存策略

當你需要多次使用同一個正則表達式時,使用re.compile預編譯這個表達式,然后使用編譯后的模式對象進行匹配,這樣可以避免重復編譯的開銷。

精簡正則表達式

編寫簡潔的正則表達式可以減少匹配時的計算量,提高性能。避免使用過于復雜的模式,尤其是那些帶有大量回溯的模式。

舉個例子,假設你有一個包含多個電話號碼的文本,需要提取出所有的電話號碼:

import retext = "Contact us at 123-456-7890, or 987-654-3210."
pattern = re.compile(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b')phone_numbers = pattern.findall(text)print("提取的電話號碼:", phone_numbers)

這段代碼會輸出:

提取的電話號碼: ['123-456-7890', '987-654-3210']

通過這些高級特性,你可以更加靈活和高效地使用正則表達式來處理文本。就像是一個高級偵探,使用各種工具和技術來解決復雜的案件。準備好了嗎?我們將繼續深入探索正則表達式的神秘世界,讓你成為一個文本處理的高手!

6. 實戰應用案例

6.1 文本提取與清洗

在文本提取與清洗的世界里,正則表達式就像是一把鋒利的瑞士軍刀,幫助你輕松應對各種棘手的文本處理任務。

提取電子郵件地址、URL

想象一下,你是一名網絡偵探,需要從海量的網絡數據中提取出有用的電子郵件地址和URL。使用正則表達式,這項任務會變得非常簡單。

import retext = """
Hello, you can contact me at example@example.com or visit my website at http://www.example.com.
"""# 提取電子郵件地址
email_pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')
emails = email_pattern.findall(text)# 提取URL
url_pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
urls = url_pattern.findall(text)print("提取的電子郵件地址:", emails)
print("提取的URL:", urls)

這段代碼會輸出:

提取的電子郵件地址: ['example@example.com']
提取的URL: ['http://www.example.com']

去除HTML標簽

作為一名內容編輯,你可能需要從網頁中提取純文本內容,去除所有煩人的HTML標簽。正則表達式在這里也能大顯身手。

import rehtml_content = """
<p>Welcome to my <strong>blog</strong>. Enjoy your stay!</p>
"""# 去除HTML標簽
clean_text = re.sub(r'<[^>]+>', '', html_content)print("清理后的文本:", clean_text)

這段代碼會輸出:

清理后的文本: Welcome to my blog. Enjoy your stay!

在這里插入圖片描述

6.2 驗證與格式匹配

在驗證與格式匹配的任務中,正則表達式就像是一把精準的尺子,確保你的數據符合特定的格式要求。

郵政編碼、電話號碼驗證

假設你是一名數據分析師,需要驗證收集到的郵政編碼和電話號碼是否符合標準格式。

import re# 驗證郵政編碼
postal_code_pattern = re.compile(r'^\d{6}$')
postal_codes = ['123456', 'ABCDE', '12345']valid_postal_codes = [code for code in postal_codes if postal_code_pattern.match(code)]
print("有效的郵政編碼:", valid_postal_codes)# 驗證電話號碼
phone_number_pattern = re.compile(r'^\d{3}[-.]\d{3}[-.]\d{4}$')
phone_numbers = ['123-456-7890', '1234567890', '123.456.7890']valid_phone_numbers = [number for number in phone_numbers if phone_number_pattern.match(number)]
print("有效的電話號碼:", valid_phone_numbers)

這段代碼會輸出:

有效的郵政編碼: ['123456']
有效的電話號碼: ['123-456-7890', '123.456.7890']

用戶名密碼復雜度檢查

作為一名網絡安全專家,你需要確保用戶的用戶名和密碼符合安全標準。

import re# 用戶名驗證(至少6個字符,包含字母和數字)
username_pattern = re.compile(r'^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$')# 密碼驗證(至少8個字符,包含大小寫字母、數字和特殊字符)
password_pattern = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$')# 檢查用戶名和密碼
usernames = ['user1', 'User123', 'short']
passwords = ['password', 'Pass123!', 'weak']valid_usernames = [username for username in usernames if username_pattern.match(username)]
valid_passwords = [password for password in passwords if password_pattern.match(password)]print("有效的用戶名:", valid_usernames)
print("有效的密碼:", valid_passwords)

這段代碼會輸出:

有效的用戶名: ['User123']
有效的密碼: ['Pass123!']

通過這些實戰案例,你可以看到正則表達式在文本提取、清洗、驗證和格式匹配等方面的強大能力。就像是一個多才多藝的超級英雄,正則表達式能夠解決各種看似不可能的任務。準備好了嗎?讓我們一起繼續探索正則表達式的無限可能,讓你在文本處理的世界中所向披靡!

7. 結論

正則表達式在Python中的威力總結

在這段旅程的尾聲,我們回顧一下,正則表達式就像是Python世界中的超級英雄,它有著無與倫比的能力,能夠處理各種文本相關的疑難雜癥。從簡單的字符匹配到復雜的數據驗證,從文本提取到格式清洗,正則表達式都能輕松應對。

正則表達式的強大之處在于它的靈活性和表達力,它能夠用簡潔的代碼完成復雜的任務。就像我們之前看到的那樣,無論是提取電子郵件地址、URL,還是去除HTML標簽,或是進行數據驗證,正則表達式都能以優雅的方式解決這些問題。

持續學習與實踐的重要性

學習正則表達式就像是學習一門藝術,它需要時間和實踐來掌握。隨著你不斷深入,你會發現正則表達式的世界是如此廣闊,總有新的東西等待你去探索和學習。

不要害怕犯錯,每一個錯誤都是學習和進步的機會。多寫代碼,多做實驗,多解決實際問題,這是提高正則表達式技能的最佳途徑。

持續進步的小貼士

  1. 多實踐:實踐是檢驗真理的唯一標準。多寫代碼,多嘗試不同的正則表達式,你會在這個過程中學到很多。

  2. 學習資源:利用好Python官方文檔、《精通正則表達式》這樣的書籍,以及像regex101.com這樣的在線實踐平臺。

  3. 理解原理:深入理解正則表達式的工作原理,這樣你就能更好地編寫和調試它們。

  4. 優化性能:學習如何優化你的正則表達式,讓它運行得更快,更高效。

  5. 分享知識:把你學到的知識分享給其他人,教學相長,你會在這個過程中獲得新的見解。

  6. 保持好奇心:對新知識保持好奇心,不斷探索正則表達式的新特性和新用途。

最后,記住,正則表達式只是工具,真正重要的是你如何使用它。就像一把劍,它在劍客手中才能發揮出最大的威力。所以,拿起你的劍,繼續在編程的世界里冒險吧!

準備好了嗎?讓我們帶著正則表達式這個強大的工具,繼續在Python的海洋中乘風破浪,探索更多的未知領域!

我是阿佑,一個專注于把晦澀的知識講得有趣的中二青年,歡迎各位路過的看官關注~

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

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

相關文章

【一站式學會Kotlin】第十三節:kotlin語言中的解構

作者介紹: 百度資深Android工程師T6,在百度任職7年半。 目前:成立趙小灰代碼工作室,歡迎大家找我交流Android、微信小程序、鴻蒙項目。= 一:通俗易懂的人工智能教程:https://www.captainbed.cn/nefu/ 點一下,打開新世界的大門。 二:【一站式學會Kotlin】免費領取:作者…

SQLSyntaxErrorException: FUNCTION dbname.to_timestamp does not exist

由于MySQL數據庫高版本&#xff08;如8.x&#xff09;中有to_timestamp(&#xff09;函數&#xff0c;低版本中&#xff08;如5.7.x&#xff09;沒有這個函數&#xff0c;服務運行報錯。 自己創建函數實現功能&#xff0c;創建語句如下&#xff1b; DELIMITER // CREATE FUN…

如何使用ChatGPT撰寫短視頻爆款文案

在這個快速發展的數字時代&#xff0c;短視頻已經成為最受歡迎的娛樂和信息獲取方式之一。對于內容創作者來說&#xff0c;如何制作出爆款短視頻&#xff0c;吸引更多觀眾的注意力&#xff0c;是他們面臨的一大挑戰。文案&#xff0c;作為視頻內容的靈魂&#xff0c;起著至關重…

ESP32 - Micropython ESP-IDF 雙線教程 中斷和定時器 (1)

ESP32 - Micropython ESP-IDF 雙線教程 中斷和定時器 ESP32中斷ESP32定時器歸納ESP32 - Micropython 定時器示例代碼代碼介紹 ESP32 - IDF 定時器示例代碼代碼解釋ESP32-IDF定時器使用介紹 ESP32中的中斷和定時器是兩種重要的硬件特性&#xff0c;它們在嵌入式系統開發中扮演著…

系統思考—戰略沙盤推演咨詢服務

今日與JSTO團隊一起學習了《戰略沙盤推演咨詢服務》。通過沙盤體驗&#xff0c;我深刻感受到組織與戰略就像一張皮的正反兩面。在轉型過程中&#xff0c;即使戰略非常明確&#xff0c;團隊成員由于恐懼和顧慮&#xff0c;往往不愿意挑戰新的業務&#xff0c;從而難以實現戰略目…

VasDolly圖形工具-Android多渠道打包福利

簡介 基于騰訊VasDolly最新版本3.0.6的圖形界面衍生版本&#xff0c;旨在更好的幫助開發者構建多渠道包 使用 下載并解壓工具包&#xff0c;找到Startup腳本并雙擊啟動圖形界面&#xff08;注意&#xff1a;本地需安裝java環境&#xff09; 渠道格式說明 txt文件&#xff…

音頻鏈接抓取技術在Lua中的實現

前言 隨著數字音樂的普及&#xff0c;越來越多的用戶選擇在線音樂平臺來享受音樂。網易云音樂作為國內領先的音樂服務平臺&#xff0c;不僅提供了豐富的音樂資源&#xff0c;還擁有獨特的社交屬性&#xff0c;吸引了大量的用戶。在眾多的音樂服務中&#xff0c;音頻鏈接的抓取…

Qt | QTabBar 類(選項卡欄)

01、上節回顧 Qt | QStackedLayout 類(分組布局或棧布局)、QStackedWidget02、簡介 1、QTabBar類直接繼承自 QWidget。該類提供了一個選項卡欄,該類僅提供了一個選項卡, 并沒有為每個選項卡提供相應的頁面,因此要使選項卡欄實際可用,需要自行為每個選項卡設置需要顯示的頁…

【面試題】JavaScript基礎高頻面試(上)

1、簡述JavaScript中map和foreach的區別&#xff1f; map和forEach都是JavaScript數組的迭代方法&#xff0c;但它們之間存在一些關鍵區別。 1. 返回值&#xff1a;map方法會返回一個新的數組&#xff0c;這個新數組是由原數組通過某個函數處理后的結果組成的。而forEach方法…

Ubuntu18.04 重裝/升級 eigen 教程

目錄 一、Eigen 1.1 ubuntu 查看 eigen 版本 1.2 卸載 老版本 eigen 二、安裝 eigen 3.4.0 2.1 配置安裝 2.2 查看版本 一、Eigen 1.1 ubuntu 查看 eigen 版本 $ dpkg -l | grep eigen1.2 卸載 老版本 eigen sudo updatedb locate eigen3會獲得一堆輸出&#xff0c;其…

springboot整合Kafka的快速使用教程

目錄 一、引入Kafka的依賴 二、配置Kafka 三、創建主題 1、自動創建(不推薦) 2、手動動創建 四、生產者代碼 五、消費者代碼 六、常用的KafKa的命令 Kafka是一個高性能、分布式的消息發布-訂閱系統&#xff0c;被廣泛應用于大數據處理、實時日志分析等場景。Spring B…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(二十一)- 微服務(1)

微服務 1.認識微服務 SpringCloud底層是依賴于SpringBoot的&#xff0c;并且有版本的兼容關系&#xff0c;如下&#xff1a; 2. 服務拆分 需求 &#xff1a; 把訂單信息和用戶信息一起返回 從訂單模塊向用戶模塊發起遠程調用 &#xff0c; 把查到的結果一起返回 步驟 &…

多態(難的起飛)

注意 virtual關鍵字&#xff1a; 1、可以修飾原函數&#xff0c;為了完成虛函數的重寫&#xff0c;滿足多態的條件之一 2、可以菱形繼承中&#xff0c;去完成虛繼承&#xff0c;解決數據冗余和二義性 兩個地方使用了同一個關鍵字&#xff0c;但是它們互相一點關系都沒有 虛函…

JAVASE總結一

1、 2、引用也可以是成員變量&#xff08;實例變量&#xff09;&#xff0c;也可以是局部變量&#xff1b;引用數據類型&#xff0c;引用&#xff0c; 我們是通過引用去訪問JVM堆內存當中的java對象&#xff0c;引用保存了java對象的內存地址&#xff0c;指向了JVM堆內存當中…

ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制(PWM)(1)

ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制&#xff08;PWM&#xff09; PWM 的基本原理PWM 的應用PWM 的優點PWM 的實現方式ESP32-micropython 中的 PWM 功能使用 micropython 控制 PWM 的代碼示例代碼介紹 ESP32-IDF 中的 PWM 功能1. 初始化配置函數2. 引腳綁定函數3. 占…

常見算法200個(5):快速排序(快排)

JS實現快速排序 1.快速排序思路&#xff1a; 選擇數組中的一個值作為基準&#xff0c;將數組中小于該值的數置于該數之前&#xff0c;大于該值的數置于該數之后&#xff0c;接著對該數前后的兩個數組進行重復操作直至排序完成。 2.代碼實現&#xff1a; function quick(arr)…

使用 Snort 進行入侵檢測

使用 Snort 進行入侵檢測 Snort 是一種流行的開源入侵檢測系統。您可以在http://www.snort.org/上獲取它。Snort 分析流量并嘗試檢測和記錄可疑活動。Snort 還能夠根據其所做的分析發送警報。 Snort 安裝 在本課中&#xff0c;我們將從源代碼安裝。此外&#xff0c;我們不會安…

2024 前端面試每日1小時

三日 1. 如何理解Vue的模板編譯原理 Vue的模板編譯實際就是將模板字符串通過解析、優化和代碼生成等步驟轉換為渲染函數的過程。這個過程中&#xff0c;AST扮演了非常重要的角色&#xff0c;它用樹形結構描述了模板的內容和結構&#xff0c;是編譯過程的核心數據結構&#xff…

MySQL——適合不適合創建索引的情況

那些情況適合創建索引 1、字段的數值具有唯一性的限制 索引本身可以起到約束的作用&#xff0c;比如唯一索引、主鍵索引都是可以起到唯一性約束的&#xff0c;因此在我們的數據表中&#xff0c;如果某個字段是唯一性的&#xff0c;就可以直接創建唯一性索引&#xff0c;或者主…

Nodejs 爬蟲 案例

1.安裝&#xff1a; npm install cheerio npm install axios2.介紹&#xff1a; 2.1 cheerio 特點和用途描述&#xff1a; HTML解析和操作&#xff1a;Cheerio 可以將 HTML 字符串加載到內存中&#xff0c;并將其轉換為一個可操作的 DOM 樹結構&#xff0c;從而可以方便地對…