python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式
1.1 不用正則表達式來匹配文本
假設我希望在一個字符串中找到電話號碼,電話號碼的格式為三個數字,一個短橫線,四個數字,一個短橫線,四個數字 比如:131-3310-5293和132-2670-9864
def IsTruePhoneNumber(content):
if(len(content))!=13: #首先判斷號碼長度是否超過13,算上短橫線長度
return False
for i in range(0,3): #判斷前三位字符是否為數字
if not content[i].isdecimal():
return False
if content[3]!='-': #判斷第四位字符是否為短橫線,不是則返回錯誤
return False
for i in range(4,8):
if not content[i].isdecimal():
return False
if content[8]!='-':
return False
for i in range(9,13):
if not content[i].isdecimal():
return False #python里面嚴格區分False和True的首字母大寫
return True
account='Please call me at 131-3310-5293 and my another telephone number is 132-2670-9864'
for i in range(len(account)):
number=account[i:i+13]
if IsTruePhoneNumber(number):
print('Phone Number is '+number)
print('It is accomplished')
#print('There will be a piece of phonenumber:')
#print(IsTruePhoneNumber(content))
結果如圖:
1.2 用正則表達式查找文本模式
正則表達式,簡稱為regex
,是文本模式的描述方法。例如,\d 是一個正則表達式,表示一位數字字符,即表示任何一位 0 到 9 的數字。Python 使用正則表達式 \d\d\d-\d\d\d-\d\d\d\d,來匹配前面的函數IsTruePhoneNumber()與之相對應的同樣文本:3 個數字、 一個短橫線、4個數字、1個短橫線、4 個數字。所有其它字符串都不能匹配 \d\d\d-\d\d\d\d-\d\d\d\d 正則表達式。
正則表達式可以更加復雜
,添加一個用得著的功能,比如在一個模式后面添加花括號\d{3},意思為匹配這個模式三次,可以應用在配對密碼方面
1.2.1創建正則表達式對象
Python中所有的正則表達式都在re模塊中,所以必須先通過import來引入re模塊
向re模塊中的re.compile()中創建一個字符串作為參數來表示正則表達式,此時將返回一個regex對象,比如,創建一個regex對象來匹配上一個IsPhoneTRUENumber()函數
1.2.2 匹配Regex對象
Regex的research()方法用來尋找與正則表達式匹配的所有對象,如果沒有找到,research()方法將返回None,顯示錯誤。如果找到,search()方法將返回一個Match對象。Match對象有一個group()方法用來返回尋找到的已匹配的文本
1.3 用正則表達式匹配更多模式
1.3.1 利用括號分組
假如分離電話號碼中的運營商號段,前三位可以區別是哪個運營商,電信,聯通或者移動,可以將號碼分為兩段。正則表達式作為參數的字符串中的第一對括號是第 1 組,第二對括號是第 2 組。通過 group() 方法匹配對象傳入整數1或2,就可以取得匹配文本的不同部分。向 group()方法傳入0或不傳入參數,將返回整個匹配的文本。
如果想要一次性得到分離的兩段字符串,就可以利用groups()方法,也可以采用兩個變量來利用groups()方法分別賦值第一段和第二段
如果
需要在正則表達式中添加括號,則可以用轉義字符\
1.3.2 利用管道匹配多個分組
字符
|
稱為管道,用來匹配多個分組中的一個時,類似于C語言中的或,就可以使用它來進行此項操作,但是返回的是第一個匹配到的對象
也可以用來匹配多個模式中的一個,作為正則表達式的一部分,比如:everywhere,everyone,everytime,everyday。提取它們共同的前綴 every(如果需要匹配換到字符,則添加倒斜杠 |)
1.3.3 利用問號實現選擇匹配
(字符串)?字符串
為選擇模式,即添加?前面的或者不添加問號前面的。?即匹配這個?前的分組零次或一次。比如:
還可以進行多模式匹配
1.3.4 利用星號實現匹配
利用
*
實現匹配*前面的分組零次或多次
1.3.5 利用加號實現匹配
利用+實現分組匹配,即+前的分組出現一次或多次,至少出現一次,如果未出現,則返回None
1.3.6 用花括號實現匹配
花括號可以規定分組的匹配次數,不符合要求則返回空或者規定的最大模式匹配次數的模式,分組中只能包含要求匹配的模式,否則返回空
格式為(模式){匹配次數} 比如(模式){3,5}則表示模式匹配次數從3到5 (){,5}則表示模式匹配次數從0到5 (){3,}則表示模式匹配次數為從3到更多次數
1.4 貪心匹配和非貪心匹配
貪心匹配盡可能匹配最多的實例,非貪心匹配盡可能匹配最少的實例
非貪心匹配在花括號后加?(問號)在正則表達式末尾加,或者是你想選擇的模式后加
1.5 findall()方法
Regex對象除了有search()方法,還有findall()方法,search()方法返回的是第一次匹配正則表達式的模式,findall()方法返回的是正則表達式匹配到的所有模式。
(1)如果正則表達式中沒有分組,則返回的為包含字符串的列表
(2)如果正則表達式中有分組,則返回的是包含元組的列表
(1)
(2)
1.6 字符分類
\d 0-9內的任意數字
\D 除0-9內的任意數字
\w 任何字母、數字或下劃線字符
\W 除字母、數字或下劃線以外的任何字符
\s 空格、制表符或換行符
\S 除空格、制表符或換行符以外的任何字符
–
–
正則表達式\d+\s\w+匹配的文本有一個或多個數字(\d+),不加加號默認為匹配一個,接下來是一個空白字 符(\s),接下來是一個或多個字母/數字/下劃線字符(\w+)。findall()方法將返回所有匹 配該正則表達式的字符串,放在一個列表中。
1.7 建立自己的字符分類
可以使用方括號來建立自己想匹配的正則表達式,格式為[匹配模式]
(1)也可以使用短橫線來劃定范圍,比如[0-99a-zA-Z],表示為從0到99,從a到z的所有小寫字母,A到Z的所有大寫字母
(2)在方括號內,普通的正則表達式符號不會被解釋,不需要加轉義字符,可以直接使用,例如 [0-5,]不需要這樣寫,直接寫為[0-5,]
(3)還可以使用
^
來表達非字符類,比如[^ban]來表示為匹配除ban以外的字符
(1)效果圖
(2)效果圖
(3)效果圖
1.8插入字符和美元字符
插入字符
^
表示模式從文本開始處匹配,美元字符
$
表示文本以該模式結束,插入字符和美元字符同時使用意味著該文本等于該正則表達式,如果不匹配則不返回
以$為結尾的正則表達式
同時以^和$結尾的正則表達式
正則表達式 '^\d+$'表示整個文本為數字
1.9 通配字符
在正則表達式中,
.
(句點)字符稱為“通配符”。它匹配除了換行之外的所有字符。. 字符只能代替一個字符
1.9.1 .* 匹配所有字符串
(星號)表示
以前的字符出現零次或多次,.(句號)表示匹配除換行外的所有字符,即匹配所有字符串
注意大小寫
(.
?)意味匹配盡可能小的模式
<.
>意為“匹配一個左尖括號,接下來是任意字符,接下來是一個右尖括號”,匹配盡可能多的模式。加問號匹配盡可能少的模式
1.9.2 利用句點字符匹配換行(re.DOTALL)
如果不加re.DOTALL,則只匹配換行符以前的。加re.DOTALL后,則匹配所以字符串
1.10 大小寫不區分的匹配
在驗證圖片中字母的時候,只涉及匹配字母,不關心它們是大寫或小寫。要讓正則表達式 不區分大小寫,可以向 re.compile()傳入 re.IGNORECASE 或 re.I,作為第二個參數。
1.11 利用sub()方法替換字符串
正則表達式不但可以找到文本模式,而且可以用新的文本替換掉這些模式。Regex 對象的 sub()方法需要傳入兩個參數。第一個參數是一個字符串,用于取代發現的匹配。第二個參數是一個字符串,即 正則表達式,用于匹配需要找到的字符串。sub()方法返回替換完成后的字符串。
1.12管理復雜的正則表達式
如果要匹配的文本模式很簡單,正則表達式就很好。但匹配復雜的文本模式, 可能需要長的、復雜的正則表達式。你可以告訴 re.compile(),忽略正則表達式字符串中的空白符和注釋,從而緩解這一點。要實現這種詳細模式,可以向 re.compile() 傳入變量 re.VERBOSE,作為第二個參數。
例如:只需在正則表達式每行后面加 #注釋即可
1.13 組合使用類似變量re.IGNORECASE,可以使用管道符
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deque python_3 . pyt
- 下一篇: java里shake是什么意思_shak