網站首頁 編程語言 正文
Python 正則表達式是什么
學習 Python 正則表達式離不開 re 模塊,所以本篇博客會配合 re 模塊進行編寫。
re 庫是 Python 中處理正則表達式的標準庫,本篇博客介紹 re 庫的同時,會簡單介紹一下正則表達式語法, 如果想深入學習正則表達式,還需要好好下一番功夫。
怎么用
正則表達式語法
正則表達式語法由字符和操作符構成,初期階段掌握下述這些內容即可。
操作符 | 說明 | 例子 |
---|---|---|
. | 任何單個字符,極少不能匹配 | ? |
[] | 字符集,對單個字符給出取值范圍 | [abc] 表示匹配 a、b、c,[a-z] 表示 a 到 z 單個字符 |
[^] | 非字符集,對單個字符給出排除范圍 | [^abc] 表示匹配 非 a、非 b、非 c 的單個字符 |
* | 前一個字符 0 次或無限次擴展 | abc* 表示 ab、abc、abcc、abccc 等 |
+ | 前一個字符 1 次或無限次擴展 | abc+ 表示 abc、abcc、abccc 等 |
? | 前一個字符 0 次或 1 次 | abc? 表示 ab、abc |
| | 左右表達式任意一個 | abc|def 表示 abc 或者 def |
{m} | 擴展前 1 個字符 m 次 | ab{2}c,表示 abbc |
{m,n} | 擴展前 1 個字符 m 到 n 次 | ab{1,2}c,表示 abc、abbc |
^ | 匹配字符串開頭 | ^abc 表示 abc 在字符串開頭 |
$ | 匹配字符串結尾 | abc$ 表示 abc 在字符串結尾 |
() | 分組標記,內部僅能使用 | 操作符 | (abc) 表示 abc,(a |
\d | 數字,等價于 [0-9] | ? |
\w | 字符,等價于 [A-Za-z0-9] | ? |
以上表示僅僅為正則表達最基礎部分內容,如果希望深入研究正則表達式,建議尋找更加全面的資料進行學習,本文只做藥引。
re 庫基本用法
re 庫主要函數如下:
- 基礎函數:compile;
- 功能函數:search、match、findall、split、finditer、sub。
在正式學習之前,先了解一下原生字符串。
在 Python 中,表示原生字符串,需要在字符串前面加上 r。 例如 my_str = 'i'am xiangpica' 在程序中會直接報錯, 如果希望字符串中 ' 可以正常運行,需要加上轉移字符 \,修改為 my_str = 'i\'am xiangpica'。 但這樣結合上文正則表達式中的操作符,就會出現問題,因為 \ 在正則表達式中是有真實含義的, 如果你使用 re 庫去匹配字符串中的 \,那需要使用 4 個反斜杠,為了避免這種情況出現,引入了原生字符串概念。
# 不使用原生字符串的正則表達式 ?"\\\\"
# 使用原生字符串的正則表達式 r"\\"
在后文會有實際的應用。
接下來在學習一個案例,例如下述代碼:
my_str='C:\number'
print(my_str)
C:
umber
本段代碼的輸出效果如下,\n 被解析成了換行,如果想要屏蔽這種現象,使用 r 即可:
my_str=r'C:\number'
print(my_str)
輸出 C:\number。
re.search 函數
該函數用于,在字符串中搜索正則表達式匹配到的第一個位置的值,返回 match 對象。 函數原型如下:
re.search(pattern,string,flags=0)
需求:在字符串 夢想橡皮擦 good good 中匹配 橡皮擦。
import re
my_str='夢想橡皮擦 good good'
pattern = r'橡皮擦'
ret = re.search(pattern,my_str)
print(ret)
返回結果:<re.Match object; span=(2, 5), match='橡皮擦'>。
search 函數的第三個參數 flags 表示正則表達式使用時的控制標記。
- re.I,re.IGNORECASE:忽略正則表達式的大小寫;
- re.M,re.MULTILINE:正則表達式中的 ^ 操作符能夠將給定字符串的每行當做匹配的開始;
- re.S,re.DOTALL:正則表達式中的 . 操作符能夠匹配所有字符。
最后將匹配到的字符串進行輸出,使用下述代碼即可實現。
import re
my_str = '夢想橡皮擦 good good'
pattern = r'橡皮擦'
ret = re.search(pattern, my_str)
if ret:
print(ret.group(0))
re.match 函數
該函數用于在目標字符串開始位置去匹配正則表達式,返回 match 對象,未匹配成功返回 None,函數原型如下:
re.match(pattern,string,flags=0)
一定要注意是目標字符串開始位置。
import re
my_str = '夢想橡皮擦 good good'
pattern = r'夢' # 匹配到數據
pattern = r'good' # 匹配不到數據
ret = re.match(pattern, my_str)
if ret:
print(ret.group(0))
re.match 和 re.search 方法都是一次最多返回一個匹配對象,如果希望返回多個值, 可以通過在 pattern 里加括號構造匹配組返回多個字符串。
re.findall 函數
該函數用于搜索字符串,以列表格式返回全部匹配到的字符串,函數原型如下:
re.findall(pattern,string,flags=0)
測試代碼如下:
import re
my_str = '夢想橡皮擦 good good'
pattern = r'good'
ret = re.findall(pattern, my_str)
print(ret)
re.split 函數
該函數將一個字符串按照正則表達式匹配結果進行分割,返回一個列表。 函數原型如下:
re.split(pattern, string, maxsplit=0, flags=0)
re.split 函數進行分割的時候,如果正則表達式匹配到的字符恰好在字符串開頭或者結尾, 返回分割后的字符串列表首尾都多了空格,需要手動去除,例如下述代碼:
import re
my_str = '1夢想橡皮擦1good1good1'
pattern = r'\d'
ret = re.split(pattern, my_str)
print(ret)
運行結果:
['', '夢想橡皮擦', 'good', 'good', '']
切換為中間的內容,則能正確的分割字符串。
import re
my_str = '1夢想橡皮擦1good1good1'
pattern = r'good'
ret = re.split(pattern, my_str)
print(ret)
如果在 pattern 中捕獲到括號,那括號中匹配到的結果也會在返回的列表中。
import re
my_str = '1夢想橡皮擦1good1good1'
pattern = r'(good)'
ret = re.split(pattern, my_str)
print(ret)
運行結果,你可以對比帶括號和不帶括號的區別進行學習:
['1夢想橡皮擦1', 'good', '1', 'good', '1']
maxsplit 參數表示最多進行分割次數, 剩下的字符全部返回到列表的最后一個元素, 例如設置匹配 1 次,得到的結果是 ['1夢想橡皮擦1', '1good1']。
re.finditer 函數
搜索字符串,并返回一個匹配結果的迭代器,每個迭代元素都是 match 對象。 函數原型如下:
re.finditer(pattern,string,flags=0)
測試代碼如下:
import re
my_str = '1夢想橡皮擦1good1good1'
pattern = r'good'
# ret = re.split(pattern, my_str,maxsplit=1)
ret =re.finditer(pattern, my_str)
print(ret)
re.sub 函數
在一個字符串中替換被正則表達式匹配到的字符串,返回替換后的字符串, 函數原型如下:
re.sub(pattern,repl,string,count=0,flags=0)
其中 repl 參數是替換匹配字符串的字符串,count 參數是匹配的最大替換次數。
import re
my_str = '1夢想橡皮擦1good1good1'
pattern = r'good'
ret = re.sub(pattern, "nice", my_str)
print(ret)
運行之后,得到替換之后的字符串:
1夢想橡皮擦1nice1nice1
re 庫其它函數
其它比較常見的函數有:re.fullmatch(),re.subn(),re.escape(), 更多內容可以查閱 官方文檔,獲取一手資料。
擴展知識
使用 re 庫匹配字符串之后,會返回 match 對象,該對象具備以下屬性和方法。
你可以順著這條線繼續學習下去。
總結
原文鏈接:https://juejin.cn/post/7102628540994027556
相關推薦
- 2022-06-29 C語言實例梳理講解常用關鍵字的用法_C 語言
- 2023-04-17 Linux命令學習之用戶切換su,sudo命令詳解_linux shell
- 2022-04-01 exception occurred during ITK-SNAP startup itk-sn
- 2023-08-01 el-table-column 內容不自動換行
- 2022-12-21 C語言中continue的用法詳解_C 語言
- 2023-12-11 Spring中的事務管理
- 2022-08-26 如何利用python在剪貼板上讀取/寫入數據_python
- 2022-09-18 C#面向對象編程中依賴反轉原則的示例詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支