python re模組與正則

2022-08-28 01:57:11 字數 4228 閱讀 2081

正規表示式中的轉義符在python的字串中也剛好有轉移的作用,但是正規表示式中的轉義符和字串中的轉義符並沒關係,且還容易有衝突。

為了避免這種衝突,我們所有的正則都以在工具中的測試結果為結果,然後只需要在正則和待匹配的字串外面都加r即可

print('\\\\n')   # \\n

print('\\n') # \n

print(r'\\n') # \\n

print(r'\n') # \n

1.2.1 re.findall()

findall 會匹配字串中所有符合規則的項,並返回乙個列表,如果未匹配到,則返回空列表。

import re

ret = re.findall('\d+','alex83')

print(ret)

1.2.2 re.search()

search 會從頭到尾從帶匹配匹配字串中取出第乙個符合條件的項,如果匹配到了,返回乙個物件,用group取值;如果沒匹配到,返回none,不能用group取值。

import re

ret = re.search('\d+','alex83')

print(ret) # 如果能匹配上返回乙個物件,如果不能匹配上返回none

if ret:

print(ret.group()) # 如果是物件,那麼這個物件內部實現了group,所以可以取值

# 如果是none,那麼這個物件不可能實現了group方法,所以報錯

1.2.3 re.match()

match 會從頭匹配字串中取出從第乙個字元開始是否符合規則,如果符合,就返回物件,用group取值;如果不符合,就返回none.

match = search + ^正則

import re

ret = re.match('\d','alex83') == re.match('^\d','alex83')

print(ret)

1.2.4 高階方法

1.2.5 re.finditer()

import re

ret = re.findall('\d','safhl02urhefy023908'*20000000) # 時間複雜度、空間複雜度都非常高

print(ret)

ret = re.finditer('\d','safhl02urhefy023908'*20000000) # ret是迭代器

for i in ret: # 迭代出來的每一項都是乙個物件

print(i.group()) # 通過group取值即可

1.2.6 re.compile()
import re

ret = re.compile('\d3') # 先配置好正則

print(ret)

r1 = ret.search('alex83') # 可以直接呼叫

print(r1)

ret.findall('wusir74')

ret = re.compile('\d+')

r3 = ret.finditer('taibai40')

for i in r3:

print(i.group())

\d 正規表示式 ——> 字串

\d str

迴圈str,找到所有的數字

1.2.7 re.split() 切割
import re

ret = re.split('\d+','alex83wusir74taibai')

print(ret) # ['alex', 'wusir', 'taibai']

ret = re.split('\d(\d)','alex83wusir74taibai') # 預設自動保留分組中的內容(被切割掉的內容)

print(ret) # ['alex', '3', 'wusir', '4', 'taibai']

1.2.8 re.sub() / re.subn() 替換
import re

ret = re.sub('\d','d','alex83wusir74taibai',1)

print(ret) # alexd3wusir74taibai

ret = re.sub('\d','d','alex83wusir74taibai',3) # 3表示替換掉幾個

print(ret) # alexddwusird4taibai

ret = re.subn('\d','d','alex83wusir74taibai') # subn 直接全部替換的

print(ret) # ('alexddwusirddtaibai', 4) # 得到乙個元組,並把一共替換掉幾個作為元組的乙個元素

1.3.1 分組命名
s1 = ''

s2 = 'wahaha ya wahaha'

# s1 -> h1 wahaha

# s2 -> a wahaha ya wahaha

import re

# 方法一

ret = re.search('<(\w+)>(.*?)',s1)

print(ret)

print(ret.group(0)) # group引數預設為0 表示取整個正則匹配的結果

print(ret.group(1)) # 取第乙個分組中的內容

print(ret.group(2)) # 取第二個分組中的內容

# 方法二(分組命名)

ret = re.search('<(?p\w+)>(?p.*?)',s1)

print(ret)

print(ret.group('tag')) # 取tag分組中的內容

print(ret.group('cont')) # 取cont分組中的內容

分組命名:

(?p《名字》正規表示式)

1.3.2 引用分組

引用分組 (?p=組名) 這個組中的內容必須完全和之前已經存在的組匹配到的內容一模一樣

s1 = ''

s2 = 'wahaha ya wahaha'

ret = re.search('<(?p\w+)>.*?',s1) # 用於約束前後<>內的內容一致

print(ret.group('tag')) # h1

# \1:轉義1,表示分組中的

s1 = ''

s2 = 'wahaha ya wahaha'

ret = re.search(r'<(\w+)>.*?',s1)

print(ret.group(1)) # h1

findall 遇到分組

findall 遇到正規表示式中的分組,會優先顯示分組中的內容

import re

ret = re.findall('\d(\d)','aa1alex83')

# findall遇到正規表示式中的分組,會優先顯示分組中的內容

print(ret)

ret = re.findall('\d+(?:\.\d+)?','1.234+2') # ?: 取消分組優先顯示

print(ret)

分組和 findall

# 例題

# 有的時候我們想匹配的內容包含在不相匹配的內容當中,這個時候只需要把不想匹配的先匹配出來,再通過手段去掉

import re

ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")

print(ret)

ret.remove('')

print(ret)

split 遇到分組:會保留分組中本來應該被切割掉的內容

def func():

print(123)

n = yield 'aaa'

print('-->',n)

yield 'bbb'

g = func()

print(g)

n = next(g)

print(n)

print('-'*20)

next(g) # g.send('uysdfhfoiusyg')與next(g)的作用一樣

正則 ?都能做什麼?

Python re 正則模組

有些字元比較特殊,它們和自身並不匹配,而是會表明應和一些特殊的東西匹配,或者它們會影響到 re 其它部分的重複次數,它們叫元字元。其中 m 和 n 是十進位制整數。該限定符的意思是至少有 m 個重複,至多到 n 個重複。舉個例子,a b 將匹配 a b a b 和 a b 它不能匹配 ab 因為沒有...

Python re正則模組

對於比較複雜的字串處理任務,需要依靠正規表示式。首先需要匯入 re 模組 import re常用的元字元 符號含義 匹配除 n 和 r 之外的任何單個字元。匹配字串開始位置 匹配字串結束位置 前面的元素重複0次,1次或多次 前面的元素重複0次或1次 前面的元素重複1次或多次 前面的元素出現了n次 前...

python re正則模組詳解

正規表示式 regular expression 描述了一種字串匹配的模式 pattern 可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串等。構造正規表示式的方法和建立數學表示式的方法一樣。也就是用多種元字元與運算子可以將小的表示式結合在一起來建立更大的表示...