2018-08-03 day15 正則表達式

正則表達式:用來做字符串查找,匹配,切割的一種工具

  • python對正則表達式的支持:提供了re模塊(python內置模塊),包含了字符串匹配、查找、切割等相關方法
  • fullmatch(正則表達式,字符串):用正則表達式來和字符串進行匹配,看是否能夠匹配成功
  • 正則表達式:是一個符合正則規范的字符串
import re  # 引入re模塊

注意:正則表達式的字符串前要加'r',來阻止轉義.

因為正則表達式有帶''的符號,具有特殊意義

1. '.'匹配一個任意字符

reStr = r'..'  # 匹配兩個任意字符的字符串
# reStr = 'ab'  # 只能匹配字符串'ab'
print(re.fullmatch(reStr, 'ab'))

2. \w:匹配一個字符是字母、數字、或下劃線

reStr = r'\w'
print(re.fullmatch(reStr, 'a'))

3. \s:匹配一個空白字符(空格、換行、制表符)

reStr = r'a\sb'
print(re.fullmatch(reStr, 'a\nb'))

4. \d:匹配一個數字字符

reStr = r'00\d'  # 匹配一個00后一個是數字的字符串
print(re.fullmatch(reStr, '009'))

5. \b:檢測單詞邊界(字符串結束或者開頭,一般字符或者換行,空白都可以作為單詞邊界)

print(re.match(r'...\b', '666?5'))  # 匹配三個連續任意字符(兩邊是邊界)

6. ^:匹配字符串開始(^th→匹配以th開頭得字符串)

print(re.findall(r'^th', 'thaaaaa ththbbb'))

7. $:匹配字符串結束

print(re.findall(r'\.(com)$', "aaa.com"))

8. \W:匹配非字母、數字、下劃線

print(re.fullmatch(r'\W\w', '+6'))

9. \S:匹配非空白字符

print(re.fullmatch(r'\S\d', '66'))

10. \D:匹配非數字

print(re.fullmatch(r'\D\w', '_a'))

11. \B:檢測非邊界

print(re.match(r'ab\Bc', 'abc'))

正則表達式符號組合

1. []匹配出現在[]中得任意一個字符

print(re.fullmatch(r'aab[3a,]', 'aab3'))  # 匹配一個字符串,前三位是aab,后面一位是3或者a或者,
print(re.fullmatch(r'[\d_]abc', '5abc'))  # 第一位是數字或者下劃線,后面是abc

2. [^]:匹配不在[]中出現的字符

print(re.fullmatch(r'abc[^\dabc]', 'abcd'))  # 前面是abc第四位不是數字和a/b/c的
'''
[0-9]:匹配0,1,2,3,4,5,6,7,8,9中的任意一個字符
[a-z]:匹配任意一個小寫字母
[A-Z]:匹配任意一個大寫字母
'''
print(re.fullmatch(r'[1-9]', '6'))
print(re.fullmatch(r'[a-zA-Z]', 'B'))
re_str = r'[]'

3. * :匹配0次或者多次

"""匹配一個字符串,前面是0個或者多個數字字符,然后是abc"""
re_str = r'\d*abc'
print(re.fullmatch(re_str, '123abc'))
print(re.fullmatch(r'\d\d*', '654654'))
print(re.fullmatch(r'[0-9][0-9]*', '654654'))
# 檢測字符串是否是合格的標識符
print(re.fullmatch('[a-zA-Z_]\w*', 'a_23w'))

4. 匹配一次或者多次

# 匹配一個字符串開頭出現一次或者多個數字字符,然后再有0次或者多次數字、字符、下劃線
print(re.fullmatch(r'\d+\d*', '123aaadwwdasadwa'))

5. 匹配0次或1次

print(re.fullmatch(r'[a-z]?123', '123'))

判斷一個字符串是否是正整數

print('=============================================================')
print(re.fullmatch(r'\+?[^0]\d*', '+0123'))  # re.fullmatch(r'[+]?[^0]\d*', '+0123')
print('=============================================================')

6. {N}:匹配N次

print(re.fullmatch(r'[a-z]{3}123', 'asd123'))  # 字符串前三個是小寫字母,后面是123

7. {N,}匹配大于等于N次

# 至少前三位是數字
print(re.fullmatch(r'[0-9]{3,}abc', '12333abc'))

8. {M,N}匹配M到N次

print(re.fullmatch(r'[0-9]{3,5}abc', '123333abc'))

9. | 分支

print(re.fullmatch(r'\d{3}|[a-z]{3}', 'zzz'))  # 匹配3個數字或3個小寫字母

10. ():匹配的時候對應分組,讓括號中的正則條件變成一個分組

print(re.fullmatch(r'(\d{3})|([a-z]{3})', 'zzz'))  # 匹配3個數字或3個小寫字母

11. *?:重復任意次,盡可能少的重復

print(re.match(r'a*?', 'aabaa'))

12. +?:重復一次或多次,盡可能少

13. ??:重復0次或1次,盡可能少

14. {N}:重復至少N次,盡可能少

15. {M,N}:重復M到N次盡可能少

正則表達式

  • 正則中:.[]{}()*+?^$|有特殊意義,所以在正則表達式中,如果想要單純的表達這些字符,需要在前面加''

注意: '-'在[]中可能是特殊的符號
.{}()
+?$|在[]中不用加\來表示字符
*

import re

# 1.\N → 匹配前面第N個組中匹配到的內容
reStr = r'([0-9][a-z]{2})6\1'
print(re.fullmatch(reStr, '8hh68hh'))
# Case:用戶名和QQ
reUserName = r'\w{6,20}'
QQ = r'[1-9]\d{4,11}'
print(re.fullmatch(reUserName, 'ads466ds4'))
print(re.fullmatch(QQ, '321321'))

# Case:正則表達式判斷字符串是不是0-255
ip = r'((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])'
# ip = reStr + r'\.' + reStr + r'\.' + reStr + r'\.' + reStr
print(re.fullmatch(ip, '12.34.7.34'))

re模塊方法

1.compile(正則字符串)將正則表達式字符串轉換成正則表達式對象

# 轉換成正則表達式對象之后,可以通過對象調用方法
re_obct = re.compile(r'\w{6,12}')
print(re_obct.fullmatch('6666666'))

2.fullmatch(正則表達式, 字符串) 完全匹配,從字符串開頭匹配到結尾

# 返回值是匹配對象,匹配失敗返回None
match = re.fullmatch(r'\w{3}', 'sss')
print(match)
# a.獲取匹配結果
print(match.group())
# b.獲取匹配到的范圍
print(match.span())
# c.獲取匹配到的開始下表和結束下標
print(match.start(), match.end())
# d.獲取被匹配的源字符串
print(match.string)

3.match(正則表達式,字符串) 不完全匹配,從字符串開頭開始匹配,匹配到正則表達式對應的范圍為止

# 返回值是匹配對象,匹配失敗返回None
match = re.match(r'\w{3}', 'asdas135sss')
print(match)
print(match.group())
print(match.string)

# 應用:判斷一個字符串是否以某種字符開頭

4.search(正則表達式,字符串) 在指定的字符串中查找某種字符串(以正則表達式來描述),如果有多個滿足條件,只返回第一個

# 返回值是匹配對象,匹配失敗返回None
print(re.search(r'\d{2,}[a-z]', 'sh23n--877m0899'))

# 應用: 判斷一個字符串是否包含某種字符

5.findall(正則表達式,字符串)獲取指定字符串中滿足條件的所有子串

# 返回值,列表中是符合要求的字符串.沒有滿足要求的字串就返回[]
result = re.findall(r'\d+', 'a132d123g15gg5fe')
print(result)
# 注意:在通過正則表達式獲取子串的時候,可以通過在正則表達式中添加括號,來約束獲取的內容(只捕獲括號中的內容)匹配的時候還是按照正則的原則去查找
# 應用:提取字符串

6.finditer(正則表達式,字符串)用法同findall,只是返回類型不同

# 返回一個迭代器,迭代器中內容是匹配對象
# 注意:()捕獲部分無效
result = re.finditer(r'[a-zA-Z](\d+)', '13asd13sad5aw=f1f65ds')
for match in result:
    print(match)

7.split(正則表達式,字符串)按正則表達式匹配到的字符串進行切割

# 返回值是列標,列表元素就是被切割后被分段的字符串
result = re.split(r'[\[\]*\-]', 'a[asd2]gk6*egafko;e-agf468-ad*ads')
print(result)

8.sub(正則表達式, 新字符串, 源字符串)在源字符串中查找符合正則的字串,替換成新的字符串

str1 = 'agljhjlnksgdkgakbjhgadbs阿凡達,美國婢女力和蘇聯坦克h'
result = re.sub(r'a', '*', str1)
print(str1, '\n'+result)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。