一、正則表達式基本符號
^ 表示匹配字符串的開始位置 (例外 用在中括號中[ ] 時,可以理解為取反,表示不匹配括號中字符串)
$ 表示匹配字符串的結束位置
* 表示匹配 零次到多次(記憶方法:符號是星星,天上的星星可以是無數個也可以看不到)
+ 表示匹配 一次到多次 (記憶方法:符號是加號,增加的意思,至少得有一個)
? 表示匹配零次或一次(記憶方法:符號是問號,那就是有或者沒有,兩種可能)
. 表示匹配單個字符
| 表示為或者,兩項中取一項
() 小括號表示匹配括號中全部字符
[] 中括號表示匹配括號中一個字符 范圍描述 如[0-9 a-z A-Z]
{} 大括號用于限定匹配次數 如 {n}表示匹配n個字符 {n,}表示至少匹配n個字符 {n,m}表示至少n,最多m
\ 轉義字符 如上基本符號匹配都需要轉義字符 如 \* 表示匹配 * 號、\w 表示英文字母和數字、\W 非字母和數字、\d 表示數字、 \D 非數字、 \s 匹配任何空白字符
更多更詳細介紹:點我查看更多正在表達式介紹
常用的正則表達式:
常用的正則表達式匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達式:(^\s*)|(\s*$)
匹配IP地址的正則表達式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
sql語句:^(select|drop|delete|create|update|insert).*$
二、re 模塊,函數介紹
2.1 re.compile
該函數將創建一個正則表達式的對象,可以實現更有效率的復用。
import re
find_xx = re.compile('正則表達式', 修飾符)
2.2 re.findall
該函數將會搜索所有滿足條件的字符串
import re
r = re.findall('正則表達式', 文本內容, 修飾符)
返回值會因為正則表達式的小括號不同而不同 共計三種情況
2.2.1 當給出的正則表達式不帶括號的時候,列表的元素為字符串,此時字符串為整個正則表達式匹配的內容。
import retext = '2018年的下半年,9月份, 27日'
pattern = re.compile(r'\d{4}年|\d{1}月|\d{2}日')
res = pattern.findall(text)
print(res)
# 輸出結果: ['2018年', '9月', '27日']
2.2.2 正則表達式中只有一個括號,列表元素為字符串時,則內容和括號中的正則表達式對應
import re
text = '2018年的下半年,9月份, 27日'
pattern = re.compile(r'\d+(年|月|日|)')
res = pattern.findall(text)
print(res)
# 輸出結果: ['年', '月', '日']
2.2.3 如果正則表達式中有多個括號時,列表的元素為多個字符組合成的元組,元組中的字符串格式與括號數對應,內容與正則表達式順序對應。
import retest = '2018年的下半年, 9月份, 27日'
pattern = re.compile(r'(\d)+(年|月|日)')
res = pattern.findall(test)
print(res)# 輸出結果為:[('8','年'),('9','月'),('7','日')]
如果不希望按小括號分組,可以在小括號開頭輸入 ?:? ,輸出結果與 2.2.1 一致
import retest = '2018年的下半年, 9月份, 27日'
pattern = re.compile(r'(\d)+(年|月|日)')
res = pattern.findall(test)
print(res)# 輸出結果為:['2018年', '9月', '27日']
2.3 re.finditer
搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是 match 對象,相比 re.findall 它可以獲取匹配的位置
import re# 編譯正則表達式對象
pattern = re.compile(r'ab.*c')# 在字符串中查找匹配正則表達式的內容
text = 'abcfabcgabch'
matches = pattern.finditer(text)# 遍歷所有匹配
for match in matches:start_pos = match.start()end_pos = match.end()match_str = match.group()print('Match found:', match_str)print('Start position:', start_pos)print('End position:', end_pos)
2.4 re.search
搜索第一個滿足條件的字符串,查找到第一個停止
import re
find_xx = re.compile('正則表達式', '修飾符')
res = re.search(find_xx, text)
2.5 re.sub
替換所有滿足條件的字符串
import re
text = 'hello 123 world 456'
replacedStr = re.sub("\d+","222",text)
print(replacedStr)
# 返回'hello 222 world 222'
?2.6 re.split
匹配分割string maxsplit是允許被分割成幾個子串,默認是0最大化字串,如果是1則是從原本字符串中切出一個字串,其他字串整串返回。
import re
a = re.split('正則表達式', '文本', [maxsplit=0])
print(a)
2.7 group([group1,....])
返回一個或者多個子組,更詳細介紹:點我查看
import re
m = re.search('正則表達式','文本')
print(m.group(2))
# 返回第二個字串