python 正則表達式集合-抄的

一.正則表達式之單個字符匹配

格式:lst = re.findall(正則表達式,要匹配的字符串)
預定義字符集 匹配內容

.匹配任意字符,除了換行符\n

\d匹配數字

\D匹配非數字

\w匹配字母或數字或下劃線     (正則函數中,支持中文的匹配)

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

\s匹配任意的空白符

\S匹配任意非空白符

\n匹配一個換行符

\t匹配一個製表符

[]匹配中括號內列舉的字符

 

字符組格式 說明    [默認必須從字符組中選一個]

|---|---|

[...] 匹配字符組中的字符|

[^...]匹配除了字符組內所有內容,之外的所有字符|

 

字符組內容|待匹配字符|匹配結果|說明|

|---|---|---|---|

[0123456789] 8  True字符組裏枚舉的各種字符,必須滿足一個,否則返回假,不匹配

[abcdefg]     9False由於字符組中沒有"9"字符,所以不匹配

[0-9] 7True可用 - 表示範圍,[0-9] 和 [0123456789]是一個意思

[a-z]  s  True  [a-z]匹配所有的小寫字母

[A-Z]B  True [A-Z]就表示所有的大寫字母

[0-9a-fA-F]e   True可以匹配數字,大小寫形式的a-f. 該正則可驗證十六進制

 

以下對上述匹配符合及使用方法進行舉例:

import re

lst = re.findall(正則表達式要匹配的字符串)

\d 匹配數字
\D 匹配非數字

lst = re.findall("\d",'123qwe456asd')
print(lst)
#結果爲: ['1', '2', '3', '4', '5', '6']
lst = re.findall("\D",'123qwe456asd')
print(lst)
#結果爲:['q', 'w', 'e', 'a', 's', 'd']

\w 字母,數字,下劃線,包含中文(正則函數當中支持中文的匹配)
\W 匹配非字母或數字或下滑線

lst = re.findall('\w',"d&*()qh321>wi")
print(lst)
#結果爲:['d', 'q', 'h', '3', '2', '1', 'w', 'i']
lst = re.findall('\W',"d&*()qh321>wi")
#結果爲:['&', '*', '(', ')', '>']
print(lst)

\s 匹配任意空白符
\S 匹配任意非空白符

strvar = """
"""
lst = re.findall('\s','     ')
print(lst)
#結果爲: [' ', ' ', ' ', ' ', ' ']
lst = re.findall("\S",strvar)
print(lst)
#結果爲: []   #因爲strvar裏面沒有空白符,沒有匹配到內容,所有返回空列表
lst = re.findall("\S"," DQHh dq")
print(lst)
#結果爲: ['D', 'Q', 'H', 'h', 'd', 'q']  #是去掉空白符的所有字符形成的列表

\n 匹配換行
\t 匹配一個製表符

strvar = """
今天 天氣     晴朗                             
"""
strvar2 = """
\t  \tdqwdq
 wd            \t                     qq
"""
lst = re.findall(r"\n",strvar)
print(lst)
#結果爲: ['\n', '\n']
print("==========")
lst = re.findall(r"\t",strvar2)
print(lst)
#結果爲: ['\t', '\t', '\t']

# ###字符組練習必須從字符組選一個,如果一個都沒有則匹配不成功
#舉例: []匹配中括號內列舉的字符
lst = re.findall("[123]","qwo1293dboh")
print(lst)
#結果爲: ['1', '2', '3']

#中間的[a-g] 表示字母a到g中出現的字母就符合匹配條件
print(re.findall("a[a-g]b",'aab abb acb adb'))
#結果爲:['aab', 'abb', 'acb', 'adb']

#在a與b之間是一位0到9的數就符合匹配
print(re.findall('a[0123456789]b','a1b a2b acb ayb a9090909009b'))
# 優化版:0123456789 => 0-9 等價
print(re.findall('a[0-9]b','a1b a2b acb ayb a9090909009b'))
#結果爲:['a1b', 'a2b']

#在a與b之間的那一位字符是出現a到g的之間的字母就匹配
print(re.findall('a[abcdefg]b','a1b a2b a3b acb ayb adb '))
# 優化版:a b c d .... z  => a-z
print(re.findall('a[a-g]b','a1b a2b a3b acb ayb adb '))
#結果爲: ['acb', 'adb']

print("================")
#中間的那一位字符可以是數字和大小寫字母
print(re.findall('a[0-9a-zA-Z]b','a-b aab aAb aWb aqba1b a8d a6b aaa5b231'))
# 優化版: a-zA-Z => A-z 可以匹配所有大小寫,但是有缺陷,一些特殊符號也匹配到了
#結果爲: ['aab', 'aAb', 'aWb', 'aqb', 'a1b', 'a6b', 'a5b']

print(re.findall('[A-z]','('))
#字母不包括( ,所有沒有匹配到,返回空列表
#結果爲: []

print(re.findall('[0-z]','9')) # 語法上允許,但是別這麼用,沒意義

#a與b 中間需要匹配兩個字符一個是0-9,另外一個是 * # / 其中選一個
print(re.findall('a[0-9][*#/]b','a1/b a2b a29b a56b a456bab'))
#結果爲: ['a1/b']

# ^ 字符組中的^ 代表除了的意思
print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd"))
#結果爲: ['a%b', 'a&b']

二.匹配多個字符 => [元字符] 量詞符號

量詞

用法說明:

?重複0次或1次

+  重複1次或多次  (至少1次)

*重複0次或多次  (任意次)

{n}重複n次

{n,}重複n次或更多次 (至少n次)

{n,m}重複n到m次

.*    .+貪婪模式匹配

.*?    .+?非貪婪模式匹配

 

# 貪婪匹配:    儘量多向後匹配 底層利用回溯算法

# 非貪婪匹配:  儘量少向後匹配

    (1)量詞加上問號?表示非貪婪 惰性匹配

(2).*?w  表示匹配任意長度任意字符遇到一個w就立即停止

 

import re
# (1) ? 匹配0個 或者 1  a
print(re.findall('a?b', 'abbzab abb aab  aaxqab'))
# ['ab', 'b', 'ab', 'ab', 'b', 'ab', 'ab']
# (2) + 匹配1個或者多個a   #必須要有a ,沒有a的就不符合
print(re.findall('a+b', 'abbzab abb aab  aaxqab'))
# ['ab', 'ab', 'ab', 'aab', 'ab']
# (3) * 匹配0個或者多個a
print(re.findall('a*b', 'abbzab abb aab  aaxqab'))
# 可以沒有,可以有,也可以多個
# ['ab', 'b', 'ab', 'ab', 'b', 'aab', 'ab']
# (4) {m,n} 匹配m個至na
print(re.findall('a{1,3}b', 'abbzab abb aab  aaxqab aaaaaab'))
# 只有存在1個a或者以上到3個a的情況才匹配
# ['ab', 'ab', 'ab', 'aab', 'ab', 'aaab']

print(re.findall('a{1}b', 'abbzab abb aab  aaxqab aaaaaaaaaab'))
# ['ab', 'ab', 'ab', 'ab', 'ab'] 只匹配一個a的

print(re.findall('a{1,}b', 'abbzab abb aab  aaxqab aaaaaaaaaab'))
# ['ab', 'ab', 'ab', 'aab', 'ab', 'aaaaaaaaaab'] 只有存在1個a或者以上就匹配

貪婪匹配 與 非貪婪匹配 [語法:量詞的後面加?]
貪婪匹配默認向更多次數匹配,底層用的是回溯算法;
非貪婪匹配默認向更少次數匹配
    在量詞的後面加一個?,就是非貪婪模式,例如:.*? .?? .+? .{m,n}? .*? 用的更多
    如果遇到了子這個字,在非貪婪模式下,匹配到第一個就返回
回溯算法:
從左向右進行匹配,一直向後找,直到再也找不到了,回頭,拿離右側最近的那個值
#普通例子:
strvar = "劉能和劉鐵錘和劉大棍子12313子"
lst = re.findall("劉.", strvar)
print(lst)
# ['劉能', '劉鐵', '劉大']
# 1.貪婪匹配
lst = re.findall("劉.?", strvar)  # .? 匹配一個字符,重複0次或1次
print(lst)
# ['劉能', '劉鐵', '劉大']

lst = re.findall("劉.+", strvar)  # + 重複1次或多次,因爲貪婪所有就無限重複匹配一個字符
print(lst)
# ['劉能和劉鐵錘和劉大棍子12313子']

lst = re.findall("劉.*", strvar)  # 重複0次或多次,也是因爲貪婪所以重複匹配一個字符
print(lst)
# ['劉能和劉鐵錘和劉大棍子12313子']

lst = re.findall("劉.*子", strvar)
print(lst)
# ['劉能和劉鐵錘和劉大棍子12313子']

# strvar1 ="劉123456789123456789121子"
lst = re.findall("劉.{1,20}子", strvar)  # 劉和子的中間可以匹配最多20個字符,如果是上面一行的strvar1會輸出空列表
print(lst, "<==>")
# ['劉能和劉鐵錘和劉大棍子12313子'] <==>

非貪婪匹配
strvar = "劉能和劉鐵錘和劉大棍子12313子"
lst = re.findall("劉.??", strvar)  # 因爲非貪婪,所有?重複0次或1次就變成匹配0次就符合了
print(lst)
# ['劉', '劉', '劉']

lst = re.findall("劉.+?", strvar)  # 因爲非貪婪模式+ 重複1次或多次,即重複一次就符合
print(lst)
# ['劉能', '劉鐵', '劉大']

lst = re.findall("劉.*?", strvar)  # 因爲非貪婪,所有*重複0次或多次就變成匹配0次就符合了
print(lst)
# ['劉', '劉', '劉']

# 匹配到第一個子就直接返回
lst = re.findall("劉.*?子", strvar)  # 從劉開始到第一個子就結束
print(lst)
# ['劉能和劉鐵錘和劉大棍子']

lst = re.findall("劉.{1,20}?子", strvar)
# 原來有更大的匹配到了,但是非貪婪選擇短的符合匹配的就輸出,最多中間匹配20次單個任意字符,20個以上就不符合
print(lst)
# ['劉能和劉鐵錘和劉大棍子']
 

三.匹配開頭結尾  => [元字符]  邊界符號

 

1.\b

\b 用來匹配邊界
\b 退格 backspace 是一個轉義字符
一般寫正則表達式的時候,字符串的前面加上一個r,讓轉義字符失效

# word 匹配d 爲右邊界 d\b  匹配w爲左邊界\bw 貪婪匹配
lst = re.findall(r".*d\b", "word pwd abc")  # d的前面匹配一次或者多次,貪婪算法匹配多次及時到符合的仍然繼續匹配知道沒有符合的獲取最長的那個符合的
print(lst)
# ['word pwd']

# 非貪婪匹配
lst = re.findall(r".*?d\b", "word pwd abc")  ##d的前面匹配一次或者多次,非貪婪算法匹配多次到最短符合就獲取
print(lst)
# ['word', ' pwd']  #注意pwd之前有個空格,也是匹配到的字符

# 優化版:舍掉空格  \S 匹配任意非空白符 ,下面就會將單詞之間的空格去掉
lst = re.findall(r"\S*?d\b", "word pwd abc")
print(lst)
# ['word', 'pwd']

# 匹配單詞的左邊界
lst = re.findall(r"\bw.* ", "word abc")  # 在*後面有個空格,就是標識匹配到空格,所有這個匹配到'word ' 這邊也存在貪婪算法
print(lst)
# ['word ']

2.必須以某個字符開頭,後面的字符無所謂

 

3.必須以某個字符結尾,前面的字符無所謂

如果正則裏面包含了^或者意味着要把字符串看成一個整體

strvar = "大哥大嫂大爺"
print(re.findall('大.', strvar))
# ['大哥', '大嫂', '大爺']

print(re.findall('^大.', strvar))
# ['大哥']

print(re.findall('大.$', strvar))
# ['大爺']

print(re.findall('^大.$', strvar))  # 沒有匹配到符合的,所有輸出空列表
# []

print(re.findall('^大.*?$', strvar))  # 字符串是一個整體,所有要匹配到結尾的字符
# ['大哥大嫂大爺']


print(re.findall('^大.*?大$', strvar))
# []  #因爲字符串中有以大開頭,但是沒有大結尾,所有匹配沒有符合的,返回空列表

print(re.findall('^大.*?爺$', strvar))
# ['大哥大嫂大爺']

# 把字符串看成一個整體,只要一個結果
print(re.findall('^g.*? ', 'giveme 1gfive gay '))
# ['giveme ']

print(re.findall('five$', 'aassfive'))
# ['five']

print(re.findall('five$', 'aassfive00'))
# []   #沒有以e結尾的

print(re.findall('^giveme$', 'giveme'))
# ['giveme']

print(re.findall('^giveme$', 'givemeq'))
# [] #沒有符合以g開頭以e結尾的

print(re.findall('^giv.me$', 'giveme'))
# ['giveme']  #中間那個.可以爲任意字符,以g開頭和以e結尾外加字符符合


print(re.findall('^giveme$', 'giveme giveme'))
# []  #沒有符合的

print(re.findall('giveme', 'giveme giveme'))  # 符合兩個
# ['giveme', 'giveme']  #沒有以什麼開頭或以什麼結尾,只要字符符合就可以符合

print(re.findall("^g.*e", 'giveme 1gfive gay'))
# ['giveme 1gfive']   #注意貪婪算法

print(re.findall("^g.*?e", 'giveme 1gfive gay'))
# ['give']    #非貪婪算法,遇到最短符合的字符串就獲取

發佈了55 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章