一. 正規表示式
正規表示式,又稱規則表示式。(英語:regular expression,在**中常簡寫為regex、regexp或re),電腦科學的乙個概念。正規表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。
正規表示式由普通字元和元字元組成, 普通字元包含大小寫字母, 數字. 在匹配普通字元的時候我們直接寫就可以了
元字元是正規表示式的靈魂
1. 字元組
字元組用括起來, 在中的內容會被匹配
[a-za-z0-9] 表示所有的數字字母
2. 簡單元字元
. 匹配除換行符之外的任意字元
\w 匹配數字或字母或下劃線
\s 匹配任意的空白符
\d 匹配數字
\n 匹配乙個換行符
\t 匹配乙個製表符
\b 匹配乙個單詞的邊界
^ 匹配字串的開始
$ 匹配字串的結尾
\w 匹配非字母或數字或下劃線
\d 匹配非數字
\s 匹配非空白符
a|b 匹配字元a或字元b
() 匹配括號內的表示式, 也表示乙個組
[...] 匹配字元組中的字元
[^...] 匹配除了字元組中字元的所有字元
3. 量詞
* 重複0次或更多次
+ 重複1次或更多次
? 重複0次或1次
重複n次
重複n次或更多次
重複n次到m次
4. 慣性匹配和貪婪匹配
* + {} 都屬於貪婪匹配, 就是盡量多的匹配到結果
在使用.*後再加?就是盡可能的少匹配, 表示惰性匹配
.*?x 表示找到下乙個x為止
5. 分組
使用()進行分組
6. 轉義
在python中, 無論是正規表示式還是待匹配的內容, 都是以字串的內容出現的
r"\\n" 表示正則的r"\n"
二. re模組
import re
python提供的一套關於處理正規表示式的模組
1. findall() 查詢所有, 返回list
result = re.findall("\d", "asdf123asdf456")
print(result)
# ['1', '2', '3', '4', '5', '6']
2. search() 進行匹配, 但是如果匹配到第乙個結果, 就會返回該結果, 匹配不到則返回none
result = re.search("\d", "asdf123asdf456")
print(result.group())
# 13. match() 只能從字串的開頭進行匹配, 匹配不到則返回none
result = re.match("\d", "asdf123asdf456")
print(result.group())
# attributeerror: 'nonetype' object has no attribute 'group'
4. finditer() 和findall用法相似, 但返回的是迭代器
result = re.finditer("\d+", "asdf123asdf456")
print(result)
for el in result:
print(el.group())
# 123
# 456
5. split() 用多個元素去切割
ret = re.split("[ab]", "qweabdfdadffbffs")
print(ret)
# ['qwe', '', 'dfd', 'dff', 'ffs']
6. sub() 替換
ret = re.sub(r"\d+", "_sb_", "faf123fsfs456dsf")
print(ret)
# faf_sb_fsfs_sb_dsf
7. subn() 替換, 替換了多少次
ret = re.subn(r"\d+", "_sb_", "faf123fsfs456dsf")
print(ret)
# ('faf_sb_fsfs_sb_dsf', 2)
8. compile() 將正規表示式編譯成乙個正規表示式物件
obj = re.compile(r"\d")
ret = obj.search("sfdaf13321fasf123fffsaf")
print(ret.group())
# 133
9. 爬蟲的乙個重點, 分組命名
result = re.finditer("姓名: (?p.*?), 愛好: (?p.*?),", "姓名: 寶寶, 愛好: 女, 年齡: 18")
for el in result:
print(el.group("name"), el.group("hobby"))
# 寶寶 女
坑1 分組合取消分組許可權
這裡因為findall會優先把匹配結果組裡的內容返回, 如果想要匹配結果, 取消許可權即可
?: 相當於取消了分組的許可權
坑2 split切割 分組加()的結果
# 坑2
ret = re.split("\d+", "asf3faf4asdf")
print(ret)
# ['asf', 'faf', 'asdf']
ret = re.split("(\d+)", "asf3faf4asdf")
print(ret)
# ['asf', '3', 'faf', '4', 'asdf']
在匹配部分加上()後切出來的結果是不同的
沒有()則沒有保留所匹配的項, 有()則保留了匹配的項
這個在某些需要保留匹配部分的使用過程是非常重要的
Python 正規表示式(基礎)
正規表示式 regular expression 是乙個特殊的字串行,描述了一種字串匹配的模式可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中,抓取特定的字串等。python處理正規表示式的模組是re模組,它是python語言擁有全部的正...
Python正規表示式基礎
直接給出字元就是精確匹配。特殊字元首先需要轉義如 d 匹配乙個數字,w 匹配乙個字母或者數字。123 d 可以匹配 1231 但是無法匹配 123a d d d 可以匹配到 123 w w w 可以匹配到 py3 表示任意乙個字元,py.可以表示py3 py 等 表示任意長個字元,表示至少乙個字元,...
python基礎(正規表示式)
正規表示式用於搜尋 替換和解析字串。正規表示式遵循一定的語法規則,使用非常靈活,功能強大。使用正規表示式編寫一些邏輯驗證非常方便,例如電子郵件位址格式的驗證。python提供了re模組實現正規表示式的驗證。1.簡介 正規表示式是用於文字匹配的工具,它在源字串中查詢與給定的正規表示式相匹配的部分,乙個...