re模組 正規表示式

2022-08-17 00:18:15 字數 4645 閱讀 1560

一、正規表示式

1、正規表示式不是python獨有的,它是一門獨立的技術,所有的程式語言都可以使用正規表示式,在python中使用正規表示式就要借助於re模組,或者是支援正規表示式書寫的方法。

2、用途:篩選字串中的特定內容

3、應用場景:爬蟲、資料分析

4、想要匹配具體的內容,可以直接寫完整的內容,不需要寫正則

5、字元組裡面的表示式都是或的關係

6、^與$連用可以精準限制匹配的內容,兩者中間寫什麼,匹配的字串就必須是什麼,多乙個不行少乙個也不行

7、類似於abc|ab這種結構的表示式  一定要將長的放前面

8、貪婪匹配:

①、正規表示式預設貪婪匹配

②、可以通過在量詞後面加上乙個?將貪婪匹配變成非貪婪匹配(惰性匹配)

9、量詞必須跟在正則符號的後面,量詞只能限制緊挨著它的那乙個正則符號

10、分組:當多個正則符號需要重複多次的時候或者當做乙個整體進行其他操作,那麼可以利用分組,分組在正則中的語法就是()

11、舉個例子,判斷一串數字是否是手機號,或者從一串數字中找出符合規則的手機號

# 純python**校驗

while true:

phone_number = input('please input your phone number : ')

if len(phone_number) == 11 \

and phone_number.isdigit()\

and (phone_number.startswith('13') \

or phone_number.startswith('14') \

or phone_number.startswith('15') \

or phone_number.startswith('18')):

print('是合法的手機號碼')

else:

print('不是合法的手機號碼')

# 正規表示式校驗

import re

phone_number = input('please input your phone number : ')

if re.match('^(13|14|15|18)[0-9]$',phone_number):

print('是合法的手機號碼')

else:

print('不是合法的手機號碼')

二、正規表示式的書寫

1、元字元

.      匹配出換行符以外的任意字元

\w      匹配字母或數字或下劃線

\s         匹配任意的空白符

\d    匹配數字

\n    匹配乙個換行符

\t    匹配乙個製表符

\b    匹配乙個單詞的結尾

^    匹配字串的開始

$    匹配字串的結尾

\w    匹配非字母或數字或下劃線

\d    匹配非數字

\s    匹配非空白符

a|b    匹配字元a或字元b

()    匹配括號內的表示式,也表示乙個組

[...]    匹配字元組中的字元

[^...]    匹配除了字元組中字元的所有字元

2、量詞

*    重複零次或更多次

+    重複一次或更多次

?    重複零次或一次

重複n次

重複n次或更多次

重複n到m次

三、轉義符

在正規表示式中,有很多有特殊意義的是元字元,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對"\"進行轉義,變成'\\'。

在python中,無論是正規表示式,還是待匹配的內容,都是以字串的形式出現的,在字串中\也有特殊的含義,本身還需要轉義。所以如果匹配一次"\n",字串中要寫成'\\n',那麼正則裡就要寫成"\\\\n",這樣就太麻煩了。這個時候我們就用到了r'\n'這個概念,此時的正則是r'\\n'就可以了。

正則待匹配字元

匹配結果

說明\n

\nfalse

因為在正規表示式中\是有特殊意義的字元,所以要匹配\n本身,用表示式\n無法匹配

\\n\n

true

轉義\之後變成\\,即可匹配

"\\\\n"

'\\n'

true

如果在python中,字串中的'\'也需要轉義,所以每乙個字串'\'又需要轉義一次

r'\\n'

r'\n'

true

在字串之前加r,讓整個字串不轉義

四、貪婪匹配

1、貪婪匹配:在滿足匹配時,匹配盡可能長的字串,預設情況下,採用貪婪匹配

正則待匹配字元

匹配結果

說明<.*>

......

預設為貪婪匹配模式,會匹配盡量長的字串

<.*?>

r'\d'

加上?為將貪婪匹配模式轉為非貪婪匹配模式,會匹配盡量短的字串

2、幾個常用的非貪婪匹配pattern

*? 重複任意次,但盡可能少重複

+? 重複1次或更多次,但盡可能少重複

?? 重複0次或1次,但盡可能少重複

? 重複n到m次,但盡可能少重複

? 重複n次以上,但盡可能少重複

3、.*?的用法

. 是任意字元

* 是取 0 至 無限長度

? 是非貪婪模式

合在一起就是取盡量少的任意字元,一般不會這麼單獨寫,他大多用在:

.*?x 就是取前面任意長度的字元,直到乙個x出現

五、re模組

import re

ret = re.findall('a', 'eva egon yuan') # 返回所有滿足匹配條件的結果,放在列表裡

print(ret) #結果 : ['a', 'a']

ret = re.search('a', 'eva egon yuan').group()

print(ret) #結果 : 'a'

# 函式會在字串內查詢模式匹配,只到找到第乙個匹配然後返回乙個包含匹配資訊的物件,該物件可以

# 通過呼叫group()方法得到匹配的字串,如果字串沒有匹配,則返回none。

ret = re.match('a', 'abc').group() # 同search,不過僅在字串開始處進行匹配

print(ret)

#結果 : 'a'

ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割

print(ret) # ['', '', 'cd']

ret = re.sub('\d', 'h', 'eva3egon4yuan4', 1)#將數字替換成'h',引數1表示只替換1個

print(ret) #evahegon4yuan4

ret = re.subn('\d', 'h', 'eva3egon4yuan4')#將數字替換成'h',返回元組(替換的結果,替換了多少次)

print(ret)

obj = re.compile('\d') #將正規表示式編譯成為乙個 正規表示式物件,規則要匹配的是3個數字

ret = obj.search('abc123eeee') #正規表示式物件呼叫search,引數為待匹配的字串

print(ret.group()) #結果 : 123

import re

ret = re.finditer('\d', 'ds3sy4784a') #finditer返回乙個存放匹配結果的迭代器

print(ret) # print(next(ret).group()) #檢視第乙個結果

print(next(ret).group()) #檢視第二個結果

print([i.group() for i in ret]) #檢視剩餘的結果

注意:1、findall的優先順序查詢:

print(ret) # ['oldboy'] 這是因為findall會優先把匹配結果組裡內容返回,如果想要匹配結果,取消許可權即可

2、split的優先順序查詢

ret=re.split("\d+","eva3egon4yuan")

print(ret) #結果 : ['eva', 'egon', 'yuan']

ret=re.split("(\d+)","eva3egon4yuan")

print(ret) #結果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之後所切出的結果是不同的,

#沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項,

#這個在某些需要保留匹配部分的使用過程是非常重要的。

re 正規表示式模組

import re 預定義字符集 d 數字 0 9 d 非數字 d s 空白字元 空格 t r n f v s 非空白字元 s w 單詞字元 a za z0 9 w 非單詞字元 w 匹配數量 匹配除換行符以外的任何單個字元 匹配前乙個字元0或無限次 盡可能多的匹配 盡可能少的進行匹配前邊的正規表示式...

正規表示式 re模組

re是python中的正規表示式模組,正則也是每個人程式設計之路上必備的基礎技能。這部落格希望即便從來沒接觸過的人看了也會使用正規表示式字元 含義.匹配除了換行符外的任何字元。可以用re.dotall來設定匹配任何字元,包括換行符 丨a丨b 表示正規表示式匹配a或者b 匹配輸入字串開始的位置,如果設...

正規表示式re模組

正規表示式re模組 編譯正規表示式模式,返回乙個物件的模式。可以把那些常用的正規表示式編譯成正規表示式物件,這樣可以提高一點效率。1 compile 格式 re.compile pattern,flags 0 pattern 編譯時用的表示式字串。flags 編譯標誌位,用於修改正規表示式的匹配方式...