3.01【python正則表達式以及re模塊】

python正則表達式以及re模塊

元字符

正則表達式的語法就由表格中的元字符組成,一般用于搜索、替換、提取文本數據

元字符含義
.匹配除換行符以外的任何單個字符
*匹配前面的模式0次或1次
+匹配前面的模式1次或多次
?匹配前面的模式0次或1次
[]用于定義字符集,匹配方括號內的任何字符
^匹配字符串的開頭
$匹配字符串的結尾
\用于轉義特殊字符,使其失去特殊含義
[^]匹配不在字符集中的任何字符
|用于表示‘或’,匹配兩個或多個選擇之一
\d匹配任何數字字符
\D匹配任何非數字字符
\w匹配任何字母數字字符或下劃線
\W匹配任何非字母數字字符或下劃線
\s匹配任何空白字符
\S匹配任何非空白字符

re模塊

常用的re模塊內置方法:

re.方法名(表達式,文本數據)

  1. re.search(pattern, string):從字符串中搜索匹配給定模式的第一個出現,并返回一個匹配對象。
  2. re.match(pattern, string):嘗試從字符串的開頭匹配給定模式,如果成功匹配,則返回一個匹配對象。
  3. re.findall(pattern, string):查找字符串中所有與給定模式匹配的非重疊部分,并返回一個列表。
  4. re.sub(pattern, replacement, string):在字符串中查找與給定模式匹配的部分,并用替換字符串替換它們。
  5. re.compile(pattern):將正則表達式模式編譯為一個正則表達式對象,以便進行復用和更高效的操作。

search()

從給定的字符串的開頭開始搜索,并在字符串中查找第一個與模式匹配的子字符串。它只返回第一個匹配的結果,并且不會查找后續的匹配

import repattern = r"apple"
string = "I have an apple and a banana"
match = re.search(pattern, string)
if match:print(type(match))              # <class 're.Match'>print("Found:", match.group())  # Found: appleprint("Start:", match.start())  # Start: 10print("End:", match.end())      # End: 15

match()

與search()相似,match()是從字符串的開頭開始嘗試匹配給定的正則表達式模式

import repattern = r"apple"
string = "I have an apple and a banana"
match = re.match(pattern, string)
if match:print("Found:", match.group())  # Found: appleprint("Start:", match.start())  # Start: 10print("End:", match.end())      # End: 15

findall()

查找并返回字符串中與給定正則表達式模式匹配的所有非重疊子字符串

import repattern = r"\d+"
string = "There are 123 apples and 456 bananas"
matches = re.findall(pattern, string)
print("Matches:", matches)  # 輸出: Matches: ['123', '456']

sub()

將搜索到的字符替換

import repattern = r"apple"
string = "I have an apple and a banana"
replacement = "orange"new_string = re.sub(pattern, replacement, string)
print(new_string)  # I have an orange and a banana

compile()

用于將正則表達式模式編譯為一個可重復使用的正則表達式對象

import repattern = r"\d+"
string = "There are 123 apples and 456 bananas"regex = re.compile(pattern)
matches = regex.findall(string)
print(matches)  # ['123', '456']

分組模式

以下是用()分組的正則表達式模式

group()中的參數可以提取分組后的數據的索引,但這個索引是從1開始的,為空則返回全部

import remob = re.compile(r'(\+86)(\d\d\d)(\d\d\d\d)(\d\d\d\d)')
phone_number1 = mob.search('我的電話號碼是+8618900043210')
print('電話號碼' + phone_number1.group())  # 電話號碼+8618900043210
print('前綴' + phone_number1.group(1))     # 前綴+86
print('前三位' + phone_number1.group(2))   # 前三位189
print('中四位' + phone_number1.group(3))   # 中四位0004
print('后四位' + phone_number1.group(4))   # 后四位3210

貪婪匹配與非貪婪匹配

默認情況下,正則表達式使用貪婪匹配。它會盡可能多地匹配字符。

在貪婪模式下,量詞后面沒有添加?時,它會匹配盡可能長的字符串。非貪婪模式則反之

例如,對于正則表達式 a.*b 和字符串 aabab,貪婪匹配將匹配整個字符串 "aabab",而非貪婪模式僅僅是第一個 "aab"

import re# 貪婪匹配示例
pattern1 = r'a.*b'
pattern2 = r'a.*?b'string = 'aabab'
match1 = re.search(pattern1, string)
match2 = re.search(pattern2, string)print(f"貪婪模式:{match1.group()}")     # 貪婪模式:aabab
print(f"非貪婪模式:{match2.group()}")   # 非貪婪模式:aab

^和$

^表示匹配字符串的開頭。當 ^ 放置在正則表達式的開頭時,它表示要匹配的內容必須出現在字符串的開頭位置

import repattern = r'^(aaa)(\d+)'
regex = re.compile(pattern)
match1 = regex.search('aaa666這是信息的格式')
match2 = regex.search('信息的格式是aaa666')
print(match1.group())  # aaa666
print(type(match2))  # <class 'NoneType'>

可以看到當開頭不存在^所匹配的字符串時就會采不到數據

同理$就是表示匹配字符串的結尾,它可以用來檢查一個字符串是否以特定的模式結束

import repattern = r'(aaa)(\d+)$'
regex = re.compile(pattern)
match1 = regex.search('aaa666這是信息的格式')
match2 = regex.search('信息的格式是aaa666')
print(type(match1))  # <class 'NoneType'>
print(match2.group())  # aaa666

多行模式(Multiline Mode)

在大部分爬蟲案例中我們需要處理包含換行符的文本(當然現在爬蟲也不咋用正則了~)這時就會用到多行模式(Multiline Mode)

import repattern2 = r"^abc$"
string2 = "abc\n123\nabc"
matches2 = re.findall(pattern2, string2, re.MULTILINE)
print(matches2)  # ['abc', 'abc']

(?P<>)

(?P…) 是正則表達式中的一個語法構造,用于給一個子模式(子表達式)命名,以便在匹配結果中可以通過名稱來引用

import repattern = r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})"
text = "Today's date is 2022-09-30."match = re.search(pattern, text)
if match:year = match.group("year")month = match.group("month")day = match.group("day")print(f"Year: {year}, Month: {month}, Day: {day}")

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

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

相關文章

Linux配置編程環境+云服務器上傳文件

Java環境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd&#xff1a;傳送門 cgbd&#xff1a;傳送門 | 傳送門

數據可視化【十四】交互式過濾地區分布圖

在前面的博客中已經介紹了如何繪制地區分布圖&#xff0c;這一節學習如何繪制交互式過濾地區分布圖。如果對繪制地區分布圖還不熟悉的話可以了解一下之前我寫的博客&#xff1a;數據可視化【十三】地區分布圖 整體的框架仍然是在之前的基礎上進行修改&#xff0c;主要是添加交…

Ubuntu環境搭建

本文記錄了一些常用的Ubuntu軟件 然后首先修改軟件源&#xff1a;軟件和更新->Ubuntu軟件->下載自&#xff1a;其他站點&#xff08;修改為阿里云&#xff09; 在關閉的時候需要更新什么的 然后修改更新方式&#xff0c;將不支持的更新去掉 常用的Windows軟件 網易云…

1 兩數之和

雖然只是一道很簡單的題&#xff0c;但是也給我很多思考。 剛看到這道題的時候沒有仔細思考&#xff0c;直接寫了個排序和二分查找&#xff0c;想著對每個數字查找另一個數字會不會出現&#xff0c;復雜度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn)&#xff0c;主要訓練了一下…

834 樹中距離之和

這道題我自己的想法只有對每個點都用一遍Dijkstra然后再求和&#xff0c;顯然會超時&#xff0c;所以我都沒有嘗試。 研究了一下題解&#xff0c;發現題解很巧妙&#xff0c;自己對樹的處理還是太稚嫩&#xff0c;之前樹鏈剖分學的都忘光了。 對于固定根節點的&#xff0c;我…

75 顏色分類

題目已經提示可以一遍掃描了但是我還是沒有想到&#xff0c;其實雙指針的想法我已經有了&#xff0c;但是一想到有問題就覺得無法實現。這也揭示了我思維上的問題&#xff1a;用一種方法解決問題遇到困難第一件事情不是想著如何攻克而是想著換一種方法。對自己的思維也不自信。…

141 環形鏈表

要求使用空間復雜度為O(1)的方法&#xff0c;可是我并沒有想到。我想到的只有用一個哈希表記錄一下所有訪問過的節點。 題解給出的空間復雜度為O(1)的方法是使用兩個指針&#xff0c;然后讓一個一次跑一步&#xff0c;一個一次跑兩步&#xff0c;如果跑的快的能追上跑的慢的就…

數據可視化【十五】

經驗法則&#xff1a;在顏色不相鄰的時候加上背景顏色顏色的個數為6~12比較好。 顏色其實很大程度上由背景決定而不是他本身決定。 D3 Scale-Chromatic 有許多顏色刻度&#xff0c;可以根據自己的需要進行選擇。 參考論文&#xff1a;Practical Rules for Using Color in Cha…

Ubuntu修改/刪除主目錄下的中文文件夾

在Ubuntu的主目錄下一般是有一些中文的目錄&#xff0c;例如桌面&#xff0c;視頻等等&#xff0c;還無法修改名稱&#xff0c;在一群英文文件夾里面顯得有些突兀&#xff08;Ubuntu終端下的中文一點也不好看&#xff09;&#xff0c;就想把這些文件夾修改一下&#xff0c;結果…

19 刪除鏈表的倒數第N個

題目的意思很簡單&#xff0c;就是刪除一個鏈表倒數第N個節點。 需要用到鏈表的標準操作&#xff1a;快慢指針。 我們讓一個快指針先指向第N個元素&#xff0c;這個時候快指針總比慢指針領先N個元素&#xff0c;等到快指針指向鏈表尾部的時候慢指針就指向需要刪除的元素。 之前…

844. Backspace String Compare

題目的意思大概是有兩個字符串&#xff0c;其中的#表示退格鍵&#xff0c;讓比較最后兩個字符串是否相當。 很容易想到的思路就是用一個棧進行模擬這個過程&#xff0c;特別需要注意如果一個串是空串也是可以退格的。 但是很容易想到的另一個特性就是&#xff0c;前面的字符有…

鏈表三連擊

876&#xff1a;鏈表的中間節點 206&#xff1a;反轉鏈表 143&#xff1a;重排練表 鏈表的中間節點 這個題一看就是最簡單的快慢指針&#xff0c;但是在具體實現的時候我還是猶豫思考了一下&#xff1a;要不要在鏈表前面放置啞節點&#xff0c;快指針應該什么時候判斷已經到達…

D3力導引圖

學習力導引圖的時候在網上沒有找到什么好的教程&#xff0c;支離破碎地進行了一段時間的學習&#xff0c;還閱讀了d3的關于d3的官方文檔&#xff0c;但是始終覺得不的要領。這里記錄一下我學習力導引圖的一些心得以及推薦一下學習資源。 學習資源 官方文檔&#xff1a;https:…

Ubuntu Pycharm啟動后卡住無法操作

昨天還好好的&#xff0c;今天打開Pycham突然卡住了&#xff0c;卡在了那個preparing workspace的地方&#xff0c;然后在網上搜索了很多方法都沒用。直到在網上看到有個大佬說是因為搜狗輸入法的問題&#xff0c;我才突然記起來昨天安裝了搜狗輸入法。。。 kill掉卡住的Pycha…

327 區間和的個數

題目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

瀏覽器訪問本地文件

之前一直苦惱無法在瀏覽器訪問本地文件&#xff0c;尤其是寫的網頁需要調用外部數據的時候&#xff0c;今天學習到可以用python很方便的解決問題 如果有python3環境&#xff0c;直接在對應的文件夾下運行&#xff08;這里是Ubuntu環境&#xff0c;如果是Windows應該在命令行也…

Ubuntu使用jupyter notebook +導出PDF

因為最近需要做數據分析的工作&#xff0c;所以復習了一下numpy和pandas&#xff0c;并安裝了jupyter notebook進行數據分析&#xff0c;這里記錄一下環境的設置。 ps:jupyter notebook真香 安裝 python3 -m pip install --upgrade pip //升級pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

給服務器重裝了一下系統&#xff0c;結果報了上述錯誤&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在網上找…

Ubuntu20.04 更新后黑屏無法加載驅動

本來我的電腦好好的&#xff0c;突然提示說有可應用的更新&#xff0c;我想都沒想就直接更新了&#xff0c;可是沒想到更新以后經過grub以后就會黑屏&#xff0c;一動不動&#xff0c;在網上搜索了許多&#xff0c;提到的說法是在grub界面對第一個Ubuntu的啟動按e進行編輯 在倒…