python3 正則表達式


一.正則表達式

1.正則表達式 (Regular Expression) 又稱 RegEx, 是用來匹配字符的一種工具. 在一大串字符中尋找你需要的內容.

2.正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配

3.re 模塊使 Python 語言擁有全部的正則表達式功能

4.它常被用在很多方面, 比如網頁爬蟲, 文稿整理, 數據篩選等等.

 

二.簡單的匹配

 1 import re
 2 # regular expression
 3 pattern1 = "dog"
 4 pattern2 = "cat"
 5 pattern3 = "bird"
 6 string = "dog runs to cat"
 7 
 8 #如果匹配成功,返回一個匹配的對象,沒找到則返回none
 9 #re.span方法顯示匹配的位置
10 #group(num) 或 groups() 來獲取匹配表達式
11 
12 #re.match:匹配string初始位置
13 #re.match(pattern, string, flags=0)
14 #pattern:匹配的正則表達式;string要匹配的字符串;flags標志位,用於控制正則表達式的匹配方式
15 print(re.match(pattern1, string))
16 print(re.match(pattern1, string).span())#span函數顯示匹配的位置
17 print(re.match(pattern1, string).group())#groop方法獲取正則表達式
18 print(re.match(pattern2, string))
19 print(re.match(pattern3, string))
20 print('*'*50)
21 
22 # re.search(pattern,string, flags=0)匹配整個string:在string中查找pattern
23 print(re.search(pattern1, string))  # <_sre.SRE_Match object; span=(12, 15), match='cat'>
24 print(re.search(pattern2, string))  #
25 print(re.search(pattern2, string).span())
26 print(re.search(pattern2, string).group())
27 print('*'*50)
28 
29 #findall(pattern, string, flags=0)在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表
30 # 注意: match 和 search 是匹配一次,匹配到結束,findall 匹配所有,匹配完結束
31 print(re.findall(r"ran", "run ran ran ran"))
32 print(re.search(r"ran", "run ran ran ran"))
33 print(re.findall(r"(run|ran)", "run ran ran ran")) # | : or
34 print(re.search(r"(run|ran)", "run ran ran ran"))
35 print('*'*50)
36 
37 #finditer(pattern, string, flags=0) 和findall類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回
38 r=re.finditer(r"(run|ran)", "run ran ren ran")
39 print(r)
40 for i in r:
41     print(i.group())
42 -------------------------------------------------
43 <_sre.SRE_Match object; span=(0, 3), match='dog'>
44 (0, 3)
45 dog
46 None
47 None
48 **************************************************
49 <_sre.SRE_Match object; span=(0, 3), match='dog'>
50 <_sre.SRE_Match object; span=(12, 15), match='cat'>
51 (12, 15)
52 cat
53 **************************************************
54 ['ran', 'ran', 'ran']
55 <_sre.SRE_Match object; span=(4, 7), match='ran'>
56 ['run', 'ran', 'ran', 'ran']
57 <_sre.SRE_Match object; span=(0, 3), match='run'>
58 **************************************************
59 <callable_iterator object at 0x058E8470>
60 run
61 ran
62 ran
match和search和finall和finditer

 

三.靈活匹配

import re
# multiple patterns 靈活匹配:匹配潛在的多個可能性文字,可用【】將可能的字符囊括起來
ptn = r"r[au]n"       # ("run" or "ran")
#建立一個正則的規則:我們在 pattern 的 “” 前面需要加上一個 r 用來表示這是正則表達式, 而不是普通字符串.
print(re.search(ptn, "dog runs to cat"))# <_sre.SRE_Match object; span=(4, 7), match='run'>

#括號 [] 中還可以是以下這些或者是這些的組合. 比如 [A-Z] 表示的就是所有大寫的英文字母. [0-9a-z] 表示可以是數字也可以是任何小寫字母
print(re.search(r"r[A-Z]n", "dog runs to cat"))
print(re.search(r"r[a-z]n", "dog runs to cat"))
print(re.search(r"r[0-9]n", "dog r2ns to cat"))
print(re.search(r"r[0-9a-z]n", "dog runs to cat"))
-----------------------------
<_sre.SRE_Match object; span=(4, 7), match='run'>
None
<_sre.SRE_Match object; span=(4, 7), match='run'>
<_sre.SRE_Match object; span=(4, 7), match='r2n'>
<_sre.SRE_Match object; span=(4, 7), match='run'>
靈活匹配

 

四.sub替換

 1 import re
 2 
 3 #re.sub(pattern, repl, string, count=0)通過正則表達式匹配上一些形式的字符串然后再替代掉這些字符串.
 4 #repl : 替換的字符串,也可為一個函數。count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
 5 print(re.sub(r"r[au]ns", "catches", "dog runs to cat"))
 6 
 7 # repl可以是一個函數。將匹配的數字乘於 2
 8 def double(matched):
 9     value = int(matched.group('value'))
10     return str(value * 2)
11 s = 'A23G4HFD567'
12 print(re.sub('(?P<value>\d+)', double, s))
13 --------------------------------------------
14 dog catches to cat
15 A46G8HFD1134
sub

 

五.compile編譯正則表達式

 1 import re
 2 #compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供match()和search()這兩個函數使用
 3 #使用 compile 過后的正則, 來對這個正則重復使用
 4 #先將正則表達式 compile為一個變量, 比如 compiled_re, 然后直接使用這個 變量compiled_re 來重復使用
 5 compiled_re = re.compile(r"r[ua]n")
 6 print(compiled_re.search("dog ran to cat"))
 7 print(compiled_re.findall("run ran ran"))
 8 ------------------------------------------------------
 9 <_sre.SRE_Match object; span=(4, 7), match='ran'>
10 ['run', 'ran', 'ran']
compile

 

六.split分割

 1 import re
 2 #split 方法按照能夠匹配的子串將字符串分割后返回列表
 3 #split(pattern, string, maxsplit=0, flags=0)
 4 #maxsplit分隔次數,maxsplit=1 分隔一次,默認為 0,不限制次數。
 5 #flags標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
 6 print(re.split(r"[,;\.]", "a;b,c.d;e"))
 7 print(re.split('\W+', ' runoob, runoob, runoob.', 1))
 8 ------------------------------------------------------
 9 ['a', 'b', 'c', 'd', 'e']
10 ['', 'runoob, runoob, runoob.']
split

 

七.正則表達式修飾符(flags):正則表達式可以包含一些可選標志修飾符來控制匹配的模式。

多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志

1 import re
2 print(re.search(r"r[A-Z]n", "dog runs to cat"))
3 print(re.search(r"r[A-Z]n", "dog runs to cat",flags=re.I))
4 ------------------------------------------------------------------------
5 None
6 <_sre.SRE_Match object; span=(4, 7), match='run'>

 

 八.正則表達式模式:

模式字符串使用特殊的語法來表示一個正則表達式:

1.字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。

2.多數字母和數字前加一個反斜杠時會擁有不同的含義。

3.標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。

4.反斜杠本身需要使用反斜杠轉義。

實例:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM